许多问题都接近名单,但没有回答我的问题......使用反射来获取静态类
如何使用C#3.5反射来获取其是从装配静态的所有类。我已经获得了所有定义的类型,但没有IsStatic属性。计数0的构造函数非常慢,也没有工作。
任何提示或一行代码? :-)
克里斯
许多问题都接近名单,但没有回答我的问题......使用反射来获取静态类
如何使用C#3.5反射来获取其是从装配静态的所有类。我已经获得了所有定义的类型,但没有IsStatic属性。计数0的构造函数非常慢,也没有工作。
任何提示或一行代码? :-)
克里斯
这里是你如何从装配得到类型:
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);
静态类是C#,而不是公共语言规范功能,所以有一个类型的实例,将表明它是一个静态类,没有一个的元数据。 但是,您可以检查它是否是密封类型,并且它的所有非继承成员都是静态的。
什么C#调用静态类,是一个抽象的,密封类到CLR。所以你需要看IsSealed & & IsSealed。
您需要合并以下检查:Abstract,Sealed,BeforeFieldInit。经过静态类编译就可以在编译的程序集中看到以下的IL代码:
.class public abstract auto ansi sealed beforefieldinit StaticClass
extends [mscorlib]System.Object
{
}
所以给凯文的回答,您可以获取类,像这样: 'IEnumerable的类型= typeof运算(富).Assembly.GetTypes() .Where(t => t.IsClass && t.IsSealed && t.IsAbstract);' –
2010-04-14 17:21:28