确定一个类型是静态的(Determine if a type is static)

2019-06-17 14:25发布

比方说,我有一个Typetype

我想确定我是否能做到这一点与我喜欢的类型(没有实际这样对每种类型):

如果typeSystem.Windows.Point话,我可以这样做:

Point point1 = new Point();

然而,如果typeSystem.Environment ,那么这将不会飞:

Environment environment1 = new Environment(); //wrong

所以,如果我通过每一个可见的类型在装配迭代我怎么跳过所有将无法创建像第二个实例的类型? 我有点新的反射,所以我不是伟大的术语呢。 希望什么,我想在这里做的是相当清楚的。

Answer 1:

static类声明abstractsealed在IL级。 所以,你可以检查IsAbstract属性来处理这两个abstract类和static类一气呵成(您的使用情况)。

但是, abstract类是不是你不能直接实例唯一的类型。 您应该检查接口等东西( 没有CoClass属性 )和类型没有通过调用代码访问的构造函数。



Answer 2:

type.IsAbstract && type.IsSealed

这将是C#足够的检查,因为抽象类不能被密封或C#静态的。 但是,你需要与其他语言的CLR类型打交道时要小心。



Answer 3:

您可以搜索公共contructors这样,

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
}


Answer 4:

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

我想,这应该工作。



Answer 5:

这是一种方式来获得所有类型的所有公共contstuctors在组件中。

    var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
    var constructors = type.GetConstructors();
}


文章来源: Determine if a type is static