2013-03-06 80 views
1

難以給出正確的標題,對此感到抱歉。將數組轉換爲單個元素傳遞給函數

我有一個類(我不能修改)具有功能

f(string arg1, string arg2, ..., string n)

我有一個數組var arr = new string[n] { ..... }

我怎麼能轉換陣列項目FO功能f傳遞,而不需要寫

f(arr[0], arr[1], ..., arr[n-1])

+0

您應該可以使用反射,例如 – Esailija 2013-03-06 12:55:32

+0

N是如何指定的?我的意思是,它不可能是動態的,因爲你有一個具有N個參數的函數? – ken2k 2013-03-06 12:56:33

+0

@Esailija:好的,我可以,但是使用Reflection編寫函數比手動編寫參數困難。當然,如果他們是少數(我有20) – Marco 2013-03-06 12:57:05

回答

3

您可能會考慮使用反射。

在這種情況下,調用鷗有可能傳遞參數數組:

methodInfo.Invoke(instanceOfClass, parametersArray) 

可以看一下例子:

Reflection: How to Invoke Method with parameters

保持atention的事實是,在這個 case根據MethodBase.Invoke文檔你有一個object[]數組,所以你必須處理boxing/unboxing,不知道這一切努力真的值得,只是簡單地通過參數,以平常的方式。

+0

我沒有想到這件事,你是對的。我會在幾個小時內看看它,然後回到你身邊。謝謝! – Marco 2013-03-06 13:01:26

+0

在我的具體情況下,它可能不值得(參數是20),但只是有一個想法,如果我需要更長的時間。我關心的是代碼的可讀性:寫下'arr [0],....,arr [19]'並不好笑,也不可維護......你怎麼看? – Marco 2013-03-06 13:03:45

+0

@Marco:好吧,如果唯一的conern是*可讀性*和* scallability *它值得去看看這個解決方案。在其他情況下,只要保持一貫的做事方式。 – Tigran 2013-03-06 13:05:26

2

你可能會使用反射,但我認爲這會比完全寫入的20個參數更難看。

如果你只需要它在一個位置,我會說只是用20個參數調用它。如果您需要在多個地方使用它,請在您自己的程序中使用20個參數創建一個函數,並在您需要的任何地方在您自己的程序中調用該函數。

+0

我喜歡這個回答,+1 – ken2k 2013-03-06 12:58:58

+0

好點,謝謝! – Marco 2013-03-06 13:08:33

0

使用諸如MethodInfo等反射將是您的選擇之一。

[1]獲取方法F的信息(僞代碼):

MethodInfo[] methodInfos = typeof (TheClassWhereFuncfExists).GetMethods(BindingFlags.Public...); 

[2]使用LINQ獲得F公司的方法信息

MethodInfo fmi= methodInfos.Where(item=> item.Name=="f").FirstOrDefault(); 

[3]一旦你的FMI,你可以通過編程的方式調用它:

fmi.Invoke(...) 

僞代碼只,未經過徹底測試。

相關問題