簡體   English   中英

Activator.CreateInstance與繼承的類不在同一個項目中

[英]Activator.CreateInstance with inherited class not in the same project

我有一個包含兩個項目的解決方案。 首先讓我來描述一下我的情景。 項目1:持有一個基類調用MyBaseClass,其中包含以下兩個我感興趣的屬性和方法:

TypeToLoad - 要使用簡單的get / set功能實例化的繼承類的靜態字符串屬性。

Instance - 靜態屬性,返回TypeToLoad中指定類型的MyBaseClass實例,代碼如下:

public static MyBaseClass Instance{
   return (MyBaseClass)Activator.CreateInstance(Type.typeof(TypeToLoad));
}

現在在第二個項目中,我繼承了MyBaseClass,如下所示(當然還添加了適當的命名空間和引用)。

public class MyInheritClass : MyBaseClass {
    //implements all other functions of MyBaseClass;
}

和我的其他代碼文件之一,在與MyInheritClass相同的項目中,我有以下幾行代碼:

Type myType = Type.typeof("MyInheritClass"); //returns the correct "Type"
MyBaseClass.TypeToLoad = "MyInheritClass";
MyBaseClass myInstance = MyBaseClass.Instance; //Errors... because Type.typeof(...) could not resolve "MyInheritClass".

當我將MyInheritClass代碼文件移動到與MyBaseClass相同的項目時,代碼運行得很好。

我的問題是,無論如何通過設置MyBaseClass.TypeToLoad =“MyInheritClass”使用MyBaseClass.Instance來創建和實例MyInheritClass,而不必在同一個項目中有這兩個類(基本DLL類庫中的MyBaseClass和另一個項目中的MyInheritClass)引用MyBaseclass DLL庫)?

我試圖搜索反射,Activator但無法找到我想要的東西。 也許我不知道這個的正確術語。

假設你實際上是指Type.GetType() (而不是Type.typeof() ,它將無法編譯),那么它清楚地記錄為完全正在你所觀察到的:

要獲取的類型的程序集限定名稱。 [...]如果類型在當前正在執行的程序集中或在Mscorlib.dll中,則提供由其名稱空間限定的類型名稱就足夠了。

它還解釋了如何修復它:將程序集的名稱添加到類型名稱。 因此,如果您的類型在MyInheritClassMyInheritClass ,它位於MyNamespace命名空間和MyAssembly程序MyNamespace (通常與項目名稱相同),您可以將類型名稱設置為

MyNamespace.MyInheritClass, MyAssembly

它應該工作。

此外,您應該避免使用字符串作為類型名稱,使用實際的Type對象會更安全。 TypeToLoad應為Type ,而不是string

或者,也許,你根本不應該使用這樣的設計。 我不知道你為什么這樣做,但我很確定有一個更好的解決方案,不涉及在這樣的基類上設置靜態字段。 (如果有兩種類型實現相同的基類,會發生什么?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM