2009-07-24 66 views
22

比方说,我有一个名为Typetype确定一个类型是静态

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

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

Point point1 = new Point(); 

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

Environment environment1 = new Environment(); //wrong 

所以,如果我通过每一个迭代在程序集中的可见类型如何跳过所有将无法创建类似第二个实例的类型?我对反思很陌生,所以我对这个术语还不太了解。希望我在这里要做的事很清楚。

回答

53

static类被声明abstractsealed在IL水平。所以,你可以检查IsAbstract属性一次处理abstract类和static类(为你的用例)。

然而,abstract类是不是你不能直接实例唯一的类型。您应该检查接口(without the CoClass attribute)以及没有调用代码可访问的构造函数的类型。

+3

感谢您的回答,我需要很长时间来自行解决这个问题。 – Beaker 2009-07-24 20:00:06

-3

这是一种获取装配中所有类型的所有公共对象的方法。

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

您可以搜索公共contructors这样,

或者,如果你只关心参数的构造函数,你可以使用

Type t = typeof(Environment); 
var c = t.GetConstructor(Type.EmptyTypes); 
if (c != null && c.IsPublic && !t.IsAbstract) 
{ 
    //You can create instance 
} 
+2

请注意,'abstract'类可以有'public'构造函数。你不一定要在'if'语句的主体中创建一个类的实例。你会得到'MemberAccessException'。 – 2009-07-24 08:31:59

+0

是啊,你是对的,我编辑了这个帖子。 – 2009-07-24 08:51:26

10
type.IsAbstract && type.IsSealed 

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

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

我想,这应该工作。