我正在使用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个参数?
答案 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个字段或属性的实体。您可以在不更改方法或函数签名的情况下使用此实体。