2011-09-11 41 views
5

我試圖從程序集列表中查找運行時的類型;我的代碼是這樣的:爲什麼Type.GetType()工作和Assembly.GetType()不起作用?

foreach (Assembly assembly in assembliesToSearch) 
{ 
    Type t = assembly.GetType(assemblyName); 
    if (t != null) 
    { 
     return t; 
    } 
} 

,而我的問題是,t總是會出現爲空。與調試器和VS2010中級窗口中播放的時候,我注意到當我把一個斷點在循環中執行以下操作:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

工程確定,但

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

不(裝配時是我知道的程序集包含我正在尋找的類 - 在調試器中,我可以在assembly.GetTypes()上放置一個監視器,瀏覽到我嘗試實例化的類,並調用assembly.GetType(「MyNamespace.MyClass ,MyNamespace「))。

有誰知道爲什麼使用Type.GetType()搜索所有程序集的作品,但搜索我知道的程序集包含使用assembly.GetType()類型不?

回答

9

從MSDN文檔的兩種方法,Type.GetType()預計的類型的組件限定名稱Assembly.GetType()期望類型的全名。這些不是一回事。

typeof(MyNamespace.MyClass).AssemblyQualifiedName計算結果爲A型(類似MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral)的程序集限定名稱,因此它不會與Assembly.GetType()呼叫時,在格式MyNamespace.MyClass期待一個字符串工作。

這可能是因爲當您將組件限定名稱傳遞給Assembly.GetType()調用時,它正在程序集中查找名稱與您提供的全名匹配的類型。它找不到一個,所以你得到一個返回nullType.GetType()調用不是這種情況,因爲它期望獲得一個類型的程序集限定名稱並且可以定位程序集和類型。


一些需要注意的:

如果您正在「試圖從組件的列表中找到一種在運行時」照你這麼說,你可能最好使用在每個組件的Assembly.GetType()通話列表並傳入該類型的全名。 Type.GetType()很可能會使用當前程序集的引用來解析類型,因此如果該類型存在於不是引用的程序集中,將不會被找到。

+0

感謝您的迴應;我最初的代碼示例沒有清楚地顯示出來,但是在我的循環中,我調用了Type t = assembly.GetType(assemblyName),assemblyName是「MyNamespace.MyClass,MyAssembly」,所以通過我的計算,它應該返回預期類型。 –

+0

@David:'MyNamespace.MyClass,MyAssembly'仍然是一個程序集限定的類型名稱。您需要從該字符串中刪除程序集名稱以使其與'Assembly.GetType()'一起使用。 – adrianbanks

+0

@adrianbanks - 你在哪裏學習的「Type.GetType()很可能會使用當前程序集的引用來解析類型」 - 它似乎不在[MSDN here]中(http:// msdn .microsoft.com/EN-US /庫/ w3f99sx1(v = vs.110)的.aspx)。另外,什麼是「當前組裝」?在我現在看的情況下,裝配的類型 - 這是發現! - 不是具有當前執行方法的程序集,也不是它的引用,但它是調用堆棧上的程序集。(我的問題的原因:我的程序集名稱中的版本是錯誤的,但找到了類型。) – davidbak

相關問題