2012-10-14 24 views
3

Possible Duplicate:
How to prevent ReflectionTypeLoadException when calling Assembly.GetTypes()獲取集中定義的類型只

我想獲得的所有類型在組件中。不過,我得到以下錯誤:

System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types.

的問題是我收到的類型是從引用,而不是單元測試環境中的另一個組件只在生產環境中可用的組件。

那麼,有沒有什麼辦法可以過濾GetTypes或類似的東西,只返回在程序集中實際定義的類型而不能獲得類型加載異常?

例如替代

.Assembly.GetTypes().Where(t => t.Namespace.Equals(... 
+0

可能會也可能不適用,但我建議您使用GetExportedTypes來代替,除非您需要查看程序集內的私有類型。 http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getexportedtypes.aspx – Phil

+0

GetExportedTypes具有完全相同的問題。當然可以使用任何一種方法,但是它不能解決訪問不同程序集中引用的基本問題。 – sweetfa

+0

爲什麼不是每個人都鏈接到[獲取裝配中的所有類型](http://haacked.com/archive/2012/07/23/get-all-types-in-an-assembly.aspx)博文我們都知道?!另外,請參閱[喬恩Skeet的答案](http://stackoverflow.com/questions/7889228/how-to-prevent-reflectiontypeloadexception-when-calling-assembly-gettypes)這是必然得到複製很多這裏 – sehe

回答

9

GetTypes只得到在裝配中定義的類型,但是,您可能不能夠因爲它們引用的是在你還沒有加載或無法找到的組件類型加載它們。例如,如果您嘗試加載從其他程序集中的類派生的類型,則會得到一個ReflectionTypeLoadException。您可以從異常對象的Types屬性中獲取您加載的類型。請注意,您將無法加載每種類型的null,並且LoaderExceptions屬性對每個類型都有例外。

public static Type[] GetTypesLoaded(Assembly assembly) 
{ 
    Type[] types; 
    try 
    { 
     types = assembly.GetTypes(); 
    } 
    catch (ReflectionTypeLoadException e) 
    { 
     types = e.Types.Where(t => t != null).ToArray(); 
    } 

    return types;  
} 
+0

-1問題清楚地提到「沒有得到類型加載異常」,你再次嘗試catch方式。 – Rikki

+4

@MohammadGoudarzi沒有辦法「沒有得到類型加載異常」,你只能捕獲它獲得你能夠加載的類型。 –

+0

那麼「Assembly.GetExportedTypes()」呢? – Rikki

相關問題