【发布时间】:2010-04-14 17:06:21
【问题描述】:
很多问题都很接近,但没有一个回答我的问题......
如何在 C# 3.5 中使用反射从程序集中获取所有静态类。我已经定义了所有类型,但是没有 IsStatic 属性。计数 0 个构造函数真的很慢,也不起作用。
任何提示或代码行? :-)
克里斯
【问题讨论】:
标签: c# reflection static
很多问题都很接近,但没有一个回答我的问题......
如何在 C# 3.5 中使用反射从程序集中获取所有静态类。我已经定义了所有类型,但是没有 IsStatic 属性。计数 0 个构造函数真的很慢,也不起作用。
任何提示或代码行? :-)
克里斯
【问题讨论】:
标签: c# reflection static
这是从程序集中获取类型的方法:
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx
然后:
寻找同时抽象和密封的类。
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<Type> types = typeof(Foo).Assembly.GetTypes().Where(t => t.IsClass && t.IsSealed && t.IsAbstract);
C# 所谓的静态类,是 CLR 的一个抽象的、密封的类。所以你需要看看 IsAbstract && IsSealed。
【讨论】:
静态类是 C# 的一项功能,而不是通用语言规范,因此 Type 实例上没有任何元数据表明它是静态类。 但是,您可以检查它是否是密封类型,以及它的所有非继承成员是否都是静态的。
【讨论】:
您需要结合以下检查:Abstract、Sealed、BeforeFieldInit。静态类编译后,你可以在编译后的程序集中看到以下 IL 代码:
.class public abstract auto ansi sealed beforefieldinit StaticClass
extends [mscorlib]System.Object
{
}
【讨论】: