2014-03-19 305 views
0

我想用Activator的反射魔法實例化一個類型。不幸的是,我想要實例化的類型有params參數類型object。看到這個摘錄:帶參數的構造函數的呼叫激活器參數

public class Foo 
{ 
    public Foo(string name, params object[] arguments) 
    { 
    } 
} 

而且實例放在這裏:

public static class Bar 
{ 
    public static object Create(params object[] arguments) 
    { 
     return Activator.CreateInstance(typeof(Foo), "foo", arguments); 
    } 
} 

現在,這有效地產生了一個構造函數的調用與簽名

new Foo(string, object[]) 

因爲object[]object

什麼其實我想要的是:

new Foo(string, object, object, object, ...) 

這甚至可能與激活?或者我如何實例化一個這樣的參數類型的類型?

回答

2

params是一個純粹編譯時的語法糖。
運行時(包括反射使用的參數綁定)忽略它。

您需要傳遞一個普通數組,就像非參數params一樣。

就你而言,這聽起來像你試圖不要撥打params過載。

你需要建立一個包含所有參數的,你希望有一個單一的(扁平化)陣列來傳遞:

object[] args = new object[arguments.Length + 1]; 
args[0] = "foo"; 
arguments.CopyTo(args, 1); 
+1

所有這些語法讓我糖尿病。 –

1

你可以通過這樣的參數:

return Activator.CreateInstance(
    typeof(Foo), 
    new object[] { "foo" }.Concat(arguments).ToArray());