确定类型是否为静态

时间:2009-07-24 05:44:35

标签: c# .net reflection types instantiation

假设我有一个名为Type的{​​{1}}。

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

如果typetype,那么我可以这样做:

System.Windows.Point

但是如果Point point1 = new Point(); type,那么这将不会飞:

System.Environment

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

5 个答案:

答案 0 :(得分:64)

static类在IL级别声明为abstractsealed。因此,您可以检查IsAbstract属性,一次性处理abstract类和static类(针对您的用例)。

但是,abstract类不是您无法直接实例化的唯一类型。您应该检查接口(without the CoClass attribute)和没有调用代码可访问的构造函数的类型。

答案 1 :(得分:12)

type.IsAbstract && type.IsSealed

这对C#来说是一个充分的检查,因为抽象类不能在C#中被密封或静态。但是,在处理来自其他语言的CLR类型时,您需要小心。

答案 2 :(得分:6)

你可以搜索像这样的公共构造函数,

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
}

答案 3 :(得分:1)

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

我想,这应该可行。

答案 4 :(得分:-3)

这是一种在程序集中获取所有类型的所有公共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();
}