2010-08-27 68 views
1

我正在使用System.Func,但已經到了它的絆腳石。5個參數的Func

System.Func<TReturn> // (no arg, with return value) 
System.Func<T, TReturn> // (1 arg, with return value) 
System.Func<T1, T2, TReturn> // (2 arg, with return value) 
System.Func<T1, T2, T3, TReturn> // (3 arg, with return value) 
System.Func<T1, T2, T3, T4, TReturn> // (4 arg, with return value) 

它接受的最大值是4個參數。

有什麼方法可以將它擴展爲5個參數嗎?

回答

5

你有幾個選項之一是定義委託你的自我這將是這樣的:

public delegate TResult Func<T1,T2,...,TN,TResult>(T1 arg1, T2 arg2,...,TN argN); 

你基本上可以將其定義爲任何數量的參數(高於4,因爲你可能會得到一個名稱衝突否則)

或者您可以將您的參數包裝到某種結構中,以便您可以使用已經爲您定義的某個Func委託。

在任何情況下,如果您不能使用某個預定義的Func委託,則應該擔心方法簽名。通常很長的參數列表是一種氣味,通常會讓你意識到該方法正在做很多(無關的)工作。因此

我個人的做法是找出其中的設計失敗和糾正,而不是正確的東西是最常見的症狀(在這種情況下定義函數求有足夠agruments 可能是固定的症狀並不是說這是因爲我不知道你的代碼)

9

移到更高版本的.NET框架。例如。 .NET 4.0有多達16

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

而3.5剛剛4

http://msdn.microsoft.com/en-us/library/yxcx7skw(v=VS.90).aspx

或者,如果你在一個較低的版本卡住了,只是你自己定義的代表。

+0

感謝您的幫助布賴恩。 我被困在.net 3.5中,無法升級。 你能幫我定義一個委託嗎?因爲我不太熟悉這樣做?你的幫助將不勝感激。 – amateur 2010-08-27 09:37:54

+0

語法在文檔中:http://msdn.microsoft.com/en-us/library/bb534303(v=VS.90).aspx – Brian 2010-08-27 09:40:41

+2

@Niall:你需要的語法是'public delegate TResult Func < T1,T2,T3,T4,T5,TResult>(T1 arg1,T2 arg2,T3 arg3,T4 arg4,T5 arg5);'etc. – LukeH 2010-08-27 09:50:24

1

我想,這是可以看到行動和Func鍵至少與框架5.0 :)

沒有任何理由移動到更高的框架的版本,因爲我無法將代碼refactore到有效的25個參數,可維護的觀點。真的,在函數簽名的方法中使用如此多的參數並不是很好的做法。使用具有5個字段或屬性的實體。您可以在不更改方法或函數簽名的情況下花費此實體。