[英]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中,則提供由其名稱空間限定的類型名稱就足夠了。
它還解釋了如何修復它:將程序集的名稱添加到類型名稱。 因此,如果您的類型在MyInheritClass
中MyInheritClass
,它位於MyNamespace
命名空間和MyAssembly
程序MyNamespace
(通常與項目名稱相同),您可以將類型名稱設置為
MyNamespace.MyInheritClass, MyAssembly
它應該工作。
此外,您應該避免使用字符串作為類型名稱,使用實際的Type
對象會更安全。 TypeToLoad
應為Type
,而不是string
。
或者,也許,你根本不應該使用這樣的設計。 我不知道你為什么這樣做,但我很確定有一個更好的解決方案,不涉及在這樣的基類上設置靜態字段。 (如果有兩種類型實現相同的基類,會發生什么?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.