【问题标题】:Use reflection to get a list of static classes使用反射获取静态类列表
【发布时间】:2010-04-14 17:06:21
【问题描述】:

很多问题都很接近,但没有一个回答我的问题......

如何在 C# 3.5 中使用反射从程序集中获取所有静态类。我已经定义了所有类型,但是没有 IsStatic 属性。计数 0 个构造函数真的很慢,也不起作用。

任何提示或代码行? :-)

克里斯

【问题讨论】:

    标签: c# reflection static


    【解决方案1】:

    这是从程序集中获取类型的方法:

    http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

    GetTypes Method

    然后:

    寻找同时抽象和密封的类。

    http://dotneteers.net/blogs/divedeeper/archive/2008/08/04/QueryingStaticClasses.aspx

    在博客中搜索我可以找到 .NET CLR 不知道静态类的概念的信息,但是允许同时使用抽象和密封类型标志。 CLR 也使用这些标志来优化其行为,例如,密封标志用于调用密封类的虚拟方法,如非虚拟方法。 所以,要问一个类型是否是静态的,你可以使用这个方法:

    来自下面的评论:

    IEnumerable<Type> types = typeof(Foo).Assembly.GetTypes().Where
    (t => t.IsClass && t.IsSealed && t.IsAbstract);
    

    【讨论】:

    • 所以给定凯文的答案,你可以像这样获得类:IEnumerable&lt;Type&gt; types = typeof(Foo).Assembly.GetTypes().Where(t =&gt; t.IsClass &amp;&amp; t.IsSealed &amp;&amp; t.IsAbstract);
    【解决方案2】:

    C# 所谓的静态类,是 CLR 的一个抽象的、密封的类。所以你需要看看 IsAbstract && IsSealed。

    【讨论】:

      【解决方案3】:

      静态类是 C# 的一项功能,而不是通用语言规范,因此 Type 实例上没有任何元数据表明它是静态类。 但是,您可以检查它是否是密封类型,以及它的所有非继承成员是否都是静态的。

      【讨论】:

        【解决方案4】:

        您需要结合以下检查:Abstract、Sealed、BeforeFieldInit。静态类编译后,你可以在编译后的程序集中看到以下 IL 代码:

        .class public abstract auto ansi sealed beforefieldinit StaticClass
            extends [mscorlib]System.Object
        {
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 2010-10-01
          • 1970-01-01
          相关资源
          最近更新 更多