2010-04-14 97 views
6

许多问题都接近名单,但没有回答我的问题......使用反射来获取静态类

如何使用C#3.5反射来获取其是从装配静态的所有类。我已经获得了所有定义的类型,但没有IsStatic属性。计数0的构造函数非常慢,也没有工作。

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

克里斯

回答

12

这里是你如何从装配得到类型:

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); 
+1

所以给凯文的回答,您可以获取类,像这样: 'IEnumerable的类型= typeof运算(富).Assembly.GetTypes() .Where(t => t.IsClass && t.IsSealed && t.IsAbstract);' – 2010-04-14 17:21:28

1

静态类是C#,而不是公共语言规范功能,所以有一个类型的实例,将表明它是一个静态类,没有一个的元数据。 但是,您可以检查它是否是密封类型,并且它的所有非继承成员都是静态的。

3

什么C#调用静态类,是一个抽象的,密封类到CLR。所以你需要看IsSealed & & IsSealed。

1

您需要合并以下检查:Abstract,Sealed,BeforeFieldInit。经过静态类编译就可以在编译的程序集中看到以下的IL代码:

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