Func为5个参数

时间:2010-08-27 09:30:33

标签: c# .net-3.5 delegates func

我正在使用System.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个参数?

3 个答案:

答案 0 :(得分: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

或者,如果你坚持使用较低版本,只需自己定义代理。

答案 1 :(得分:5)

你有一些选择,就是定义你自己的代表:

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

你基本上可以为任意数量的参数定义它(高于4,因为你可能会得到名称冲突)

或者您可以将参数包装到某种结构中,以便您可以使用已为您定义的Func委托之一。

在任何情况下,如果您不能使用其中一个预定义的Func委托,则应该担心方法签名。通常很长的参数列表是一种气味,通常会让您意识到该方法正在进行大量(无关)的工作。

因此,我个人的方法是找出设计失败的地方并纠正错误,而不是纠正最常出现的症状(在这种情况下定义具有足够agruments的Func 可以修复症状不是说因为我不知道你的代码而是

答案 2 :(得分:1)

我想,有可能在框架5.0中看到Action和Func至少有25个参数:)

没有任何理由转移到更高的框架版本,因为我无法将我的代码重构为有效的,可维护的视图。实际上,在函数签名的方法中使用这么多参数并不是一个好习惯。使用具有5个字段或属性的实体。您可以在不更改方法或函数签名的情况下使用此实体。