2013-03-13 61 views
1

我遇到了一個奇怪的問題。我正在開發一個動態工廠項目,我的目的是能夠基於XML文件創建新的對象。我的問題是這樣的:項目之間的Type.GetType()可見性問題(Visual C#)

  1. 我有一個單獨的項目爲工廠的基類,我有

    public abstract class DynamicContentFactory<T, Params> where T: class where Params: DynamicParameters 
    
  2. 在這個抽象類我有一個靜態方法Create如下

    public static T Create(Params data) 
    
  3. Params只包括一個字符串作爲默認稱爲Type。我想限制對象相同的命名空間的基類T的創作,所以我做了以下內容:

    string namespaceStr = typeof(T).ToString(); 
    namespaceStr = namespaceStr.Substring(0, namespaceStr.LastIndexOf('.') + 1); 
    
    Type type = Type.GetType(namespaceStr + data.Type); 
    
  4. 在我的主要項目中,我有一個具體的工廠類

    public class ItemFactory : DynamicContent.DynamicContentFactory<ItemFactory, ItemParameters> 
    { 
    } 
    
  5. 問題是當我撥打ItemFactory.Create時,Type.GetType返回nullItemFactory與我希望它創建的項目駐留在同一個命名空間中,但基類駐留在另一個命名空間中。有沒有辦法解決?

  6. 我試過將Type.GetType()的參數更改爲typeof(T).ToString(),以測試它是否能找到它,也沒有找到它。我無法創建從我的DynamicContent項目到我的主項目的鏈接,因爲已經存在另一種方式的鏈接。我覺得這是愚蠢的,它甚至不能找到它在初始化類的類型

所以我的問題是:什麼是去解決這個問題的最好方法?我寧願將我的DynamicContent項目作爲單獨的庫保存在單獨的項目中,而不是將其包含在我的主項目中。有沒有辦法讓它找到這些類,還是必須爲我想要使用它初始化的類型創建第三個項目,以便能夠從主項目和DynamicContent項目中引用它?

BR,

-Sami你正在觀察

回答

4

行爲預期 - Type.GetType

的typeName - 該集限定名的類型來獲得的。請參閱AssemblyQualifiedName。如果該類型位於當前正在執行的程序集或Mscorlib.dll中,則只需提供由其名稱空間限定的類型名即可。

請注意,您當前的代碼工作,因爲它屬於指定行爲的「當前正在執行的程序集」部分,其中名稱空間+名稱就足夠了。

  • 您在請求時應指定類型的完整名稱,但您可以檢查該類型將使用的名稱空間。
  • 您可以切換到Assembly.GetType而不是Type.GetType並使用T的程序集來查找要創建的類型。
  • 另一種方法是掃描所有您想要的類型的加載程序集,但如果類型來自尚未加載的程序集,則可能不夠。

剩餘部分:.Net中的命名空間名稱沒有多大意義 - 它們是約定使代碼更具可讀性,但是在其中實現的程序集和名稱空間之間沒有特定的關聯。

+0

謝謝!這澄清了一點點。我通過調用Assembly.GetCallingAssembly()。GetType()來設法解決這個問題。我想這樣做會很糟糕,因爲我們無法保證CallingAssembly包含T. – 2013-03-13 16:37:26

+0

不要忘記命名空間的其他一些功能,例如解決名稱相同的類型之間的歧義等。 – Charleh 2013-03-13 16:38:54