【问题标题】:Identifying all types with some attribute识别具有某些属性的所有类型
【发布时间】:2010-04-10 10:15:39
【问题描述】:

我对 .Net 反射有疑问。这个概念对我来说相当新,我正在用一些测试用例来探索它,看看什么有效,什么无效。我正在构建一个示例,其中我通过扫描我的类型的属性来动态填充一组菜单。

基本上,我想在我的主命名空间中找到声明“SomeAttribute”的每个类型(不管它是什么,它目前没有任何成员)。我所做的是:

    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,这显然不是我想要的。是否有正确和适当的方法来查找当前程序集中的所有“真实”“合理”类型(即我定义的类)?

【问题讨论】:

  • 我刚刚发现了一些东西 - 据说 Assembly.GetExportedTypes 可以让类对外界可见。我想知道这是否会更好,但我仍然想确保我没有找错树。
  • MyApplication 有什么问题?它应该没有区别。你得到哪个例外?在 MyApplication 的情况下,您的代码中似乎没有任何内容应该崩溃。
  • 看看你的功能需求,你会不会比'.Net Attributes'更好?
  • 请在问题中添加您遇到的例外情况。
  • 这是一个无效操作 - 原因是我只是粗心地识别了类型并且它被当作什么都没有传递。马文 - 我对你的问题感到困惑。你是什​​么意思这与我已经使用的不同?

标签: .net reflection custom-attributes


【解决方案1】:

IsDefined() 很可能会失败,因为Type.GetType("SomeAttribute") 返回 null。尝试将命名空间添加到属性名称:

Type.GetType("SomeNamespace.SomeAttribute")

【讨论】:

  • 谢谢,原因非常明显。感谢所有其他响应者,因为它都是有用的信息,但这个是技术上的答案 - 根本原因是我自己的粗心。
【解决方案2】:

来个 Linq 怎么样

var list =  AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).
                        Where(x => x.GetCustomAttributes(typeof(MyAttribute), false).Length > 0);

【讨论】:

    猜你喜欢
    • 2022-10-15
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    相关资源
    最近更新 更多