37

假设我有一个Type被调用的type.

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

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

Point point1 = new Point();

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

Environment environment1 = new Environment(); //wrong

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

4

5 回答 5

85

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

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

于 2009-07-24T05:50:32.683 回答
23
type.IsAbstract && type.IsSealed

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

于 2009-07-24T06:05:55.960 回答
7

你可以像这样搜索公共承包商,

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
}
于 2009-07-24T05:56:57.193 回答
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));

我想,这应该可行。

于 2009-07-24T07:26:43.767 回答
-4

这是一种在程序集中获取所有类型的所有公共构造函数的方法。

    var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
    var constructors = type.GetConstructors();
}
于 2009-07-24T05:54:53.563 回答