确定类型是否为静态
假设我有一个叫做type
。
我想确定我是否可以使用我的类型执行此操作(实际上不对每种类型执行此操作):
如果type
是System.Windows.Point
那么我可以这样做:
Point point1 = new Point();
但是,如果type
是System.Environment
那么这将不会飞:
Environment environment1 = new Environment(); //wrong
因此,如果我遍历程序集中的每个可见类型,如何跳过将无法创建第二个实例的所有类型? 我对反思很陌生,所以我的术语还不是很好。 希望我在这里尝试做的很清楚。
static
类在IL级别被声明为abstract
和sealed
。 因此,您可以检查IsAbstract
属性, IsAbstract
处理abstract
类和static
类(对于您的用例)。
但是, abstract
类不是您无法直接实例化的唯一类型。 您应该检查接口( 没有CoClass
属性 )和没有调用代码可访问的构造函数的类型。
type.IsAbstract && type.IsSealed
这对C#来说是一个充分的检查,因为抽象类在C#中不能被密封或静态。 但是,在处理来自其他语言的CLR类型时,您需要小心。
你可以搜索这样的公共结构,
Type t = typeof(Environment); var c = t.GetConstructors(BindingFlags.Public); if (!t.IsAbstract && c.Length > 0) { //You can create instance }
或者,如果您只对无参数构造函数感兴趣,则可以使用
Type t = typeof(Environment); var c = t.GetConstructor(Type.EmptyTypes); if (c != null && c.IsPublic && !t.IsAbstract ) { //You can create instance }
Type t = typeof(System.GC); Console.WriteLine(t.Attributes); TypeAttributes attribForStaticClass = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit; Console.WriteLine((t.Attributes == attribForStaticClass));
我猜,这应该有效。
这是一种在assembly中获取所有类型的所有公共contstuctor的方法。
var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes var types = assembly.GetTypes(); foreach (var type in types) { var constructors = type.GetConstructors(); }