Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 5个参数的Func_C#_.net 3.5_Delegates_Func - Fatal编程技术网

C# 5个参数的Func

C# 5个参数的Func,c#,.net-3.5,delegates,func,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> /

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

移动到更高版本的.NET framework。例如,NET 4.0最多有16个

而3.5只有4个


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

移动到较高版本的.NET framework。例如,NET 4.0最多有16个

而3.5只有4个


或者,如果您仍停留在较低版本中,只需自己定义代理即可。

我想,在framework 5.0中,至少可以使用25个参数查看Action和Func:


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

我想,在framework 5.0中,至少有25个参数可以看到Action和Func:


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

您有几个选项,其中之一是定义您自己的委托,如下所示:

public delegate TResult Func<T1,T2,...,TN,TResult>(T1 arg1, T2 arg2,...,TN argN); 
您基本上可以为大于4的任何数量的参数定义它,因为否则可能会得到名称冲突

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

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


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

您有几个选择,一个是自己定义委托这看起来像:

public delegate TResult Func<T1,T2,...,TN,TResult>(T1 arg1, T2 arg2,...,TN argN); 
您基本上可以为大于4的任何数量的参数定义它,因为否则可能会得到名称冲突

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

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


因此,我个人的方法是找出设计失败的地方,并纠正它,而不是纠正最常见的症状。在这种情况下,定义一个具有足够面积的Func可以纠正症状,而不是说它是,因为我不知道您的代码。

谢谢您的帮助。我被困在.NET3.5中,无法升级。你能帮我自己定义一个代表吗?因为我不太熟悉这样做?感谢您的帮助。语法在文档中:@Niall:您需要的语法是public delegate TResult FuncT1 arg1、T2 arg2、T3 arg3、T4 arg4、T5 arg5;等等,我不喜欢看到实际使用带有16个参数的委托的代码;谢谢你的帮助,布莱恩。我被困在.NET3.5中,无法升级。你能帮我自己定义一个代表吗?因为我不太熟悉这样做?感谢您的帮助。语法在文档中:@Niall:您需要的语法是public delegate TResult FuncT1 arg1、T2 arg2、T3 arg3、T4 arg4、T5 arg5;等等,我不喜欢看到实际使用带有16个参数的委托的代码;