2009-07-24 116 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)); 

我想,這應該工作。