2010-07-23 78 views
0

我想要做的是這樣的。從字符串動態創建對象到派生類型

我有一個繼承樹看起來像這樣

BaseType 
BaseType : DerType1 
BaseType : DerType2 
BaseType : DerType3 

所以首先我聲明BaseType類型的變量使用

BaseType b; 

任何派生類型的可以讀作爲字符串

所以我有一個實例創建者的東西像

object o = Activator.CreateInstance(Type.GetType(readValue)); 

什麼,我那麼想要做的就是這個新對象分配給B

喜歡的東西

b = o //Doesn't work obviously because of casting rules 
b= (DerType1)o; //works 

,但我無法弄清楚如何動態地重新輸入打算投

b = (o.GetType())o; //what i want but can't be done like this 

也許有一種使用泛型的技巧我沒有想過?

我發現了一篇文章談論與泛型

public T GetInstance<T>(string type) where T: new() 
     { 
      return (T)Activator.CreateInstance(Type.GetType(typeName)); 
     } 

做這樣的東西,但在我看來,我仍然需要在調用靜態引用類型名稱這種方法

b = GetInstance<DerType1>("DerType1") 
b = GetInstance<DerType2>("DerType2") 
b = GetInstance<DerType3>("DerType3") 

感謝您的想法。

也許我應該採取一種全新的,更好的方法? 此外也許我只是不重視作爲

b = (BaseType)Activator.CreateInstance(Type.GetType(typeName)); 

似乎是有幫助的

+2

您可以直接轉換爲BaseType;您不需要轉換爲最常用的派生類型,以便存儲到BaseType變量。 – 2010-07-23 18:14:25

+1

因爲你所有的類都是從BaseType派生的,並且你的變量是這個類型,所以這個類型的轉換應該使用這個類型來完成,而不是使用特定的子類'b =(BaseType)o;'。我錯過了什麼嗎? – CriGoT 2010-07-23 18:18:13

回答

1

爲什麼不乾脆宣佈:

object o; 

BaseType o; 

然後,你可以這樣做:

BaseType o = Activator.CreateInstance(Type.GetType(readValue)) as BaseType; 
+0

這正是我偶然發現的。在創建我的信息期間。 – Beta033 2010-07-23 18:28:13

2

不要強制轉換爲派生類型,如果你不這樣做與他們任何事情。只投給基類型:

BaseType b = (BaseType)Activator.CreateInstance(Type.GetType(readValue)); 

你只需要投比BaseType更具體的一個類型,如果你要編寫依賴於該派生類型的成員代碼。如果要以多態方式處理所有派生類型,只需轉換爲基本類型。

類型層次結構內施放不改變對象的引用你的類型......他們只是執行快速運行時檢查(以確保引用實際上該類型),然後重新詮釋參考。

0

我會建議爲你的類型創建一個工廠(鑄造一切BaseType,因爲這是你真正要使用的類型):

public static BaseTypeFactory 
{ 
    public enum Types { DerType1, DerType2, DerType3 } 

    public static BaseType CreateInstance(Types type) 
    { 
     switch(type) 
     { 
      case Types.DerType1: 
       return (BaseType) Activator. 
        CreateInstance(Type.GetType("DerType1")); 
      case Types.DerType2: 
       return (BaseType) Activator. 
        CreateInstance(Type.GetType("DerType2")); 
      case Types.DerType3: 
       return (BaseType) Activator. 
        CreateInstance(Type.GetType("DerType3")); 
      default: 
       thrown new ArgumentException("Invalid Type specified"); 
     } 
    } 
} 
+0

這似乎不是很靈活。 – 2010-07-23 18:33:08

相關問題