我有一個情況,我有一個可調用的「動態」類型的對象。我試圖實現一個函數,它將在運行時用一組參數動態調用對象。這是很容易調用它,如果我知道的參數的數量在編譯時:是否可以在C#中調用動態對象?
Object StaticInvoke(dynamic func, Object[] args) {
// arguments are explicitly unwrapped and bound to the invokation
// requiring that we know the number at compile time
return func(args[0], args[1], ...);
}
但是,這並不能達到我想要的東西,因爲args數組是可變的長度。我無法找出一種方法來支持任意數量的參數。最近我想出的是這樣的:
static Object Invoke(dynamic func, Object[] args)
{
// not sure what to put here
switch(args.Length)
{
case 0:
return func();
case 1:
return func(args[0]);
case 2:
return func(args[0], args[1]);
...
default:
throw new NotSupportedException();
}
}
這將限制我可能傳遞的參數的數量。我想我可以忍受這個限制,但感覺就像我想要做的事情應該是可能的。
我基本上試圖在C#中實現JavaScript「應用」功能。有沒有更簡單的方法來完成我想要做的事情?我覺得我失去了一些明顯的東西。
爲什麼你的代碼的用戶會直接調用'Invoke'而不是直接調用'func(...)'? – 2012-04-17 17:57:25
我懷疑有一種內置的方式來做你正在嘗試使用反射來做的事情,但我不是那方面的專家。相反,我會提到,如果你想在C#中使用可變數量的參數,你應該看看'params'關鍵字。我的免責聲明是,我不認爲你實際上需要'params',你想調用一個使用反射的方法。 – 2012-04-17 18:16:08
@ M.Babcock:我試圖創建的「invoke」是實現一個接口方法,以便我們可以像使用舊腳本引擎中的「傳統」調用一樣使用新的動態調用。 – MarkPflug 2012-04-17 18:35:24