2013-01-02 234 views
0

可能重複:
Activator.CreateInstance - How to create instances of classes that have parameterized constructors非默認構造函數

我想知道如何不使用默認的構造函數在運行時創建確定的類型的對象。

也就是說,我有BaseClass和各種子類。

Type type; //this variable will be one of the child classes 
BaseClass base = Activator.CreateInstance(type); 

這允許我創建一個具有默認構造函數的子類對象,但我想調用一個特定的構造函數。我知道所有的子類都有一個構造函數需要一定的參數,所以我不擔心那個構造函數不存在。我發現this的問題,但最好的我可以到那裏是一個單一的字符串參數。這是可行的嗎?

+0

http://stackoverflow.com/questions/1288310/activator-createinstance-how-to-創建-實例-的類 - 即具備的,paramete#答案-1288333 – xandercoded

回答

3

三個選項:

第三個選項要求每次添加一個新的類型,當然,時間來改變你的工廠代碼 - 但它只是一個單線。

我個人喜歡第一個選項,因爲它給了你最大的控制權(而不是依靠Activator.CreateInstance在執行時找到最好的匹配構造函數) - 如果這是對性能敏感的代碼,你可以構建一個代表字典在執行時通過發現構造函數,然後使用表達式樹。 (據我所知,你不能使用Delegate.CreateDelegate從構造函數構建代理,這有點煩人。)

2

您可以使用Activator.CreateInstance(Type, Object[])重載來執行此操作。它會根據提供的參數調用最可靠的構造函數。

例如:

public class Test{ 
public Test(){ 
    Console.WriteLine("Defaul ctor"); 
} 

public Test(int i){ 
    Console.WriteLine("Test(int)"); 
} 

public Test(int i, string s){ 
    Console.WriteLine("Test(int, string)"); 
} 
} 

public static void Main() 
{ 
    var o1 = Activator.CreateInstance(typeof(Test)); 
    var o2 = Activator.CreateInstance(typeof(Test), 1); 
    var o3 = Activator.CreateInstance(typeof(Test), 1, "test"); 
}