1

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

4

3 回答 3

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

或者,如果您停留在较低版本,只需自己定义委托。

于 2010-08-27T09:32:11.910 回答
5

您有几种选择,一种是定义您自己的委托,如下所示:

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

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

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

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

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

于 2010-08-27T10:05:06.307 回答
1

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

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

于 2010-08-27T09:49:38.697 回答