确定类型是否为静态

Bea*_*ker 29 .net c# reflection types instantiation

假设我有一个Type电话type.

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

如果type是,System.Windows.Point那么我可以这样做:

Point point1 = new Point();
Run Code Online (Sandbox Code Playgroud)

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

Environment environment1 = new Environment(); //wrong
Run Code Online (Sandbox Code Playgroud)

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

Meh*_*ari 69

static类被声明abstract并且sealed在IL级别.因此,您可以检查IsAbstract属性以一次性处理abstract类和static类(对于您的用例).

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

  • 谢谢你的回答,我需要很长时间来自己提出这个问题. (3认同)

Joe*_*ung 15

type.IsAbstract && type.IsSealed
Run Code Online (Sandbox Code Playgroud)

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


Ars*_*yan 6

你可以搜索这样的公共结构,

Type t = typeof(Environment);
var c = t.GetConstructors(BindingFlags.Public);
if (!t.IsAbstract && c.Length > 0)
{
     //You can create instance
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只对无参数构造函数感兴趣,则可以使用

Type t = typeof(Environment);
var c = t.GetConstructor(Type.EmptyTypes);
if (c != null && c.IsPublic && !t.IsAbstract )
{
     //You can create instance
}
Run Code Online (Sandbox Code Playgroud)

  • 注意,`abstract`类可以有一个`public`构造函数.您不一定要在`if`语句的主体中创建类的实例.你会得到`MemberAccessException`. (2认同)