.net 用某些属性标识所有类型
我对.Net反射有一个问题。这个概念对我来说是相当新的,我正在用一些测试用例来探索它,看看什么是有效的,什么是无效的。我正在构建一个示例,通过扫描类型的属性,动态填充一组菜单 基本上,我希望在我的主命名空间中找到声明“SomeAttribute”的每个类型(不管它是什么,它目前没有任何成员)。我所做的是:.net 用某些属性标识所有类型,.net,reflection,custom-attributes,.net,Reflection,Custom Attributes,我对.Net反射有一个问题。这个概念对我来说是相当新的,我正在用一些测试用例来探索它,看看什么是有效的,什么是无效的。我正在构建一个示例,通过扫描类型的属性,动态填充一组菜单 基本上,我希望在我的主命名空间中找到声明“SomeAttribute”的每个类型(不管它是什么,它目前没有任何成员)。我所做的是: For Each itemtype As Type In Reflection.Assembly.GetExecutingAssembly().GetTypes If
For Each itemtype As Type In Reflection.Assembly.GetExecutingAssembly().GetTypes
If itemtype.IsDefined(Type.GetType("SomeAttribute"), False) Then
'do something with the type
End If
Next
这会使应用程序在启动时崩溃—它标识的第一种类型是MyApplication,这显然不是我想要的。是否有一种正确的方法来查找当前程序集中所有“真正的”“合理的”类型,即我定义的类?来一点Linq怎么样
var list = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).
Where(x => x.GetCustomAttributes(typeof(MyAttribute), false).Length > 0);
由于
Type.GetType(“SomeAttribute”)
返回null,因此IsDefined()
很可能失败。尝试将命名空间添加到属性名称:
Type.GetType("SomeNamespace.SomeAttribute")
我刚刚发现了一些东西——Assembly.GetExportedTypes据说可以让类对外部可见。我想知道这是否会更好,但我仍然想确保我没有找错方向。我的应用程序有什么问题?这应该没什么区别。你有什么例外?在
MyApplication
的情况下,您的代码中似乎没有任何东西会崩溃,使用´.Net Attributes´不是更好吗?请在问题中添加一个例外。这是一个无效的操作-原因是我只是不小心标识了类型,而它被作为零传递。马文-我被你的问题弄糊涂了。你说这和我已经在用的有什么不同?谢谢,原因显而易见。感谢所有其他的回复者,因为这都是有用的信息,但从技术上来说,这是答案——根本原因是我自己的粗心。