2012-05-23 58 views
1

我想從未引用的程序集中獲取類型。我用this answer來解決我的問題。在對象列表中加載未引用程序集的類型

現在的問題是,我正在加載類型ObjectList,其中包含另一個程序集的另一種類型。我不喜歡這樣寫道:

Assembly assembly = Assembly.LoadFrom ("@c:\myAssemblies\myAssembly.Data.DomainObjects.dll"); 
Type myType = assembly.GetType ("myAssembly.Data.DomainObjects.ObjectList`1[[myAssembly.otherNamespace.myClass, myAssembly.otherNamespace, Version=1.13.73.1082, Culture=neutral, PublicKeyToken=fee00910d6e5f53b]]"); 

組裝與otherNamespace也沒有提及,因此GetType方法返回null。我現在的問題是:

是否有可能獲得包含另一種類型的未引用程序集的對象列表的類型?或者:如何在我的ObjectList中加載某個類型的程序集?

+0

我假設Objectlist'1引用泛型類? –

+0

@DaveBish:是的。 –

回答

0

好吧,這是有點難受測試 - 但我希望我的回答可以轉換:

基本上,你需要做的兩個步驟 -

  1. 解決泛型參數鍵入(myAssembly.otherNamespace.myClass,在你的情況下)
  2. 根據泛型參數的類型生成新類型。

這裏有一個Linqpad腳本:

void Main() 
{ 
    //resolve the inner type 
    var parameterType = Type.GetType("UserQuery+GenericParameter"); 

    //Use the generic type, and generate with the inner parameter type 
    var genericTypeWithParameter = Type.GetType("UserQuery+Moop`1") 
     .MakeGenericType(parameterType); 

    //The resolved type - printed to console 
    genericTypeWithParameter.Dump(); 
} 

public class Moop <T> { } 
public class GenericParameter { } 
0

我不是100%肯定這一點,但是當我試試這個:

public class Moop<T> {} 

而且我做的:

Type.GetType("UserQuery.Moop`1") //returns null 

Type.GetType("UserQuery+Moop`1") //returns the correct type 

在Linqpad

編輯: '+'意味着它只是一個嵌套類型 - 所以,這可能不是正確的答案。

+0

當它是一個嵌套類型時,你會得到+,在OP的情況下相當不可能。 –

+0

乾杯 - 很高興知道。那麼我懷疑這就是答案。 –

+0

我用'+'試過了,但不幸的是它沒有工作,'GetType'仍然返回'null'。 –

0

如果裝配myAssembly.otherNamespace.dll是不是在同一個目錄中的可執行文件或安裝在GAC,公共語言運行時無法找到它。因此myAssembly.otherNamespace.dll未加載到AppDomain,並且無法獲取所需的類型。

把這兩樣myAssembly.Data.DomainObjects.dllmyAssembly.otherNamespace.dll到可執行文件或者將它們安裝到GAC同一目錄中。然後使用Load(而不是LoadFrom)確保將它們加載到相同的Load Cntext

如果裝配元myAssembly.Data.DomainObjects.dll包含參照裝配myAssembly.otherNamespace.dll,後者應時自動加載前加載。否則,你必須先加載兩個程序集,然後才能得到你想要的類型。

相關問題