2011-03-31 60 views
15

我需要使用反射來動態創建一個C#類型。這是我的場景:我正在編寫一個基類,它需要實例化某個對象作爲其初始化的一部分。基類將不知道它應該實例化的對象的類型,但派生類將會。所以,我想讓派生類在base()調用中將類型傳遞給基類。代碼如下所示:如何使用反射動態實例化類型?

public abstract class MyBaseClass 
{ 
    protected MyBaseClass(Type myType) 
    { 
     // Instantiate object of type passed in 
     /* This is the part I'm trying to figure out */ 
    } 
} 

public class MyDerivedClass : MyBaseClass 
{ 
    public MyDerivedClass() : base(typeof(Whatever)) 
    { 
    } 
} 

換句話說,基類正在委託其派生類型選擇要實例化的對象類型。

有人可以協助嗎?

回答

42

嘗試Activator.CreateInstance(Type)

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

+3

+1,不知道爲什麼這是倒票。平衡它。 – JaredPar 2011-03-31 00:16:55

+1

已接受,從我的+1 – 2011-03-31 00:48:05

+2

有點受限:「使用該類型的」default「構造函數創建指定類型的實例。」只有默認的構造函數。在構造過程中使用參數時,這可能更有用:使用最符合指定參數的構造函數創建指定類型的實例=> http://msdn.microsoft.com/en-us/library/4b0ww1we.aspx – 2013-08-26 09:02:58

17

您正在尋找Activator.CreateInstance

object instance = Activator.CreateInstance(myType); 

有此方法,可以採取構造函數參數或其他信息,找到類型的各種重載(如作爲字符串形式的名稱)

+0

謝謝,傑瑞德!我會接受斯圖亞特的回答,因爲他一分鐘就把你擊敗了蜂鳴器。但是從我+1。 – 2011-03-31 00:15:20

+11

接受最好的答案,而不是第一個! :) – stusherwin 2011-03-31 00:20:01

13

您可能需要使用仿製藥,而不是:

public abstract class MyBaseClass<T> where T : new() 
{ 
    protected MyBaseClass() 
    { 
     T myObj = new T(); 
     // Instantiate object of type passed in 
     /* This is the part I'm trying to figure out */ 
    } 
} 

public class MyDerivedClass : MyBaseClass<Whatever> 
{ 
    public MyDerivedClass() 
    { 
    } 
} 

where T : new()需要支持的new T()結構。

+0

這是一個很好的解決方案 - 我可能實際使用它來代替Activator.CreateInstance,這正是我試圖記住的地方。從我+1。 – 2011-03-31 00:14:19