2010-04-14 94 views
6

許多問題都接近名單,但沒有回答我的問題......使用反射來獲取靜態類

如何使用C#3.5反射來獲取其是從裝配靜態的所有類。我已經獲得了所有定義的類型,但沒有IsStatic屬性。計數0的構造函數非常慢,也沒有工作。

任何提示或一行代碼? :-)

克里斯

回答

12

這裏是你如何從裝配得到類型:

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

GetTypes Method

然後:

尋找那些抽象的,在同一時間密封類。

http://dotneteers.net/blogs/divedeeper/archive/2008/08/04/QueryingStaticClasses.aspx

搜索在博客我能找到的信息.NET CLR不知道靜態類的想法,但允許同時使用抽象和密封型標誌。 CLR也使用這些標誌來優化其行爲,例如使用密封標誌調用非虛擬類的密封類的虛擬方法。 因此,要問,如果一個類型是靜態的還是沒有,你可以使用這個方法:

從下面的評論:

IEnumerable<Type> types = typeof(Foo).Assembly.GetTypes().Where 
(t => t.IsClass && t.IsSealed && t.IsAbstract); 
+1

所以給凱文的回答,您可以獲取類,像這樣: 'IEnumerable的類型= typeof運算(富).Assembly.GetTypes() .Where(t => t.IsClass && t.IsSealed && t.IsAbstract);' – 2010-04-14 17:21:28

1

靜態類是C#,而不是公共語言規範功能,所以有一個類型的實例,將表明它是一個靜態類,沒有一個的元數據。 但是,您可以檢查它是否是密封類型,並且它的所有非繼承成員都是靜態的。

3

什麼C#調用靜態類,是一個抽象的,密封類到CLR。所以你需要看IsSealed & & IsSealed。

1

您需要合併以下檢查:Abstract,Sealed,BeforeFieldInit。經過靜態類編譯就可以在編譯的程序集中看到以下的IL代碼:

.class public abstract auto ansi sealed beforefieldinit StaticClass 
    extends [mscorlib]System.Object 
{ 
}