Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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# 如何扩展Func委托以包含最多四个参数?_C#_Linq To Sql_Delegates_Lambda - Fatal编程技术网

C# 如何扩展Func委托以包含最多四个参数?

C# 如何扩展Func委托以包含最多四个参数?,c#,linq-to-sql,delegates,lambda,C#,Linq To Sql,Delegates,Lambda,我在编译查询中使用LINQ,基本上是使用Func传递到编译查询中,但问题是它最多有四个参数 这是一种良好的做法吗 有什么方法可以扩展它,或者我应该创建自己的委托吗 有时我需要通过六个参数,其他五个,其他四个或更少。。。因此,如果有四个或更少,我可以继续使用Func委托 当前传入的数据上下文和我需要的参数组合取决于每个单独的已编译查询。只需声明您自己的委托-这样做只需一行代码。如果需要,请参阅以获取一种模板 我不知道这对LINQ编译的查询会有多好的效果——希望这不会是一个问题,但您的用例对我来说还

我在编译查询中使用LINQ,基本上是使用
Func
传递到编译查询中,但问题是它最多有四个参数

这是一种良好的做法吗

有什么方法可以扩展它,或者我应该创建自己的委托吗

有时我需要通过六个参数,其他五个,其他四个或更少。。。因此,如果有四个或更少,我可以继续使用
Func
委托


当前传入的数据上下文和我需要的参数组合取决于每个单独的已编译查询。

只需声明您自己的委托-这样做只需一行代码。如果需要,请参阅以获取一种模板

我不知道这对LINQ编译的查询会有多好的效果——希望这不会是一个问题,但您的用例对我来说还不够清楚,无法确定

请注意,在中,最多支持8个参数的Func/Action。

Jon所说的话加上


正如你所建议的,一般来说,你不应该有太多的参数——一般来说,你应该发现一些统一的概念跳出来告诉你。话虽如此,我不会在4这个地方放一行“这太疯狂了”。

@Mitch:你能帮我一下吗(在我的书中,50岁以上的人并不是世界末日):我同意鲁本的观点——引入一个新类来携带所有这些参数会更明智(你甚至可能想使用一个接口来提供更松散的耦合). 换句话说,您将以类似于
Func
的内容结束,其中
IMyData
包含一系列(只读)属性。谢谢jon,所以我认为如果.net 4.0最多有8个参数,那么使用5个参数创建自己的Func不是一个好主意。。我应该给它起个别的名字,或者至少把它放在它自己的名称空间里?@mark:这取决于你在构建什么,以及你打算如何接近.NET 4.0。如果它是一个可以与不同版本的.NET一起使用的库,那就很棘手了。如果它是一个可以通过删除委托声明“升级”一次的应用程序,那就更简单了。谢谢Jon,这就是我要做的。当.net 4.0出现时,删除委托Jon,我有一个问题-也许你可以确认,新委托正在工作,但我需要将它传递到LINQ的编译器中。。而且它最多只能支持4个。。。我已经用reflector查看了代码,但似乎最好的方法是按照Ruben的建议在参数对象中传递参数。。但这意味着我必须为每个不同的参数集合创建一个新的参数对象?您知道更好的方法吗?不知道-如果您需要将其传递到LINQ to SQL,则必须使用LINQ to SQL能够理解的委托类型。感谢Ruben的评论,我将保留此内容以备将来使用!目前我只需要最多6个,我想-所以我认为它非常易于管理Hi Ruben,我正在考虑使用您的技术,但在示例中,它创建了一个类型为int、string等的参数对象。。您知道是否可以使用一种泛型版本,这样我就可以使用这个对象来传递内部的所有不同类型。我可以把它指定为Object,但我需要转换为实际的类型?嗨,Mark,对模式示例的引用是由编辑器插入的(谢谢Groo!)。如果您希望使用预定义的类,那么它更像元组(在F#和.NET4中)。IPO的要点是,您将创建一个具有良好名称的新类,该类代表您正在传递的一组部件背后的整体概念,例如,您有一个
DocumentDefinition
,其中包含属性或方法,而不是“header、body、trailer”。没有什么能阻止你把字典当作包来传递它们,但那是一种不同的方法。有关元组的信息(如Twitter,所以将URL的字母计算为真实字母!),请参阅阅读你与马的对话。。。这可能适用于您的上下文,也可能不适用于您的上下文——当您发现自己传递了大量等待识别的类的参数时,这只是一种通用的重构。