确定类型是否为静态

假设我有一个叫做type

我想确定我是否可以使用我的类型执行此操作(实际上不对每种类型执行此操作):

如果typeSystem.Windows.Point那么我可以这样做:

 Point point1 = new Point(); 

但是,如果typeSystem.Environment那么这将不会飞:

 Environment environment1 = new Environment(); //wrong 

因此,如果我遍历程序集中的每个可见类型,如何跳过将无法创建第二个实例的所有类型? 我对反思很陌生,所以我的术语还不是很好。 希望我在这里尝试做的很清楚。

static类在IL级别被声明为abstractsealed 。 因此,您可以检查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(); }