2009-11-09 57 views
2

我一直在使用LINQ编译查询,基本上使用Func传入编译查询,但问题是它最多有四个参数。如何扩展Func委托以包含多于最多四个参数?

这是否是很好的做法?

有什么办法可以延长这个或者我应该创建自己的委托吗?

有时我需要通过6个参数,其他5个,其他4个或更少...因此,如果有4个或更少,我可以继续使用Func代表。

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

+0

@米奇:你能帮助我与我的(任何超过50心不是世界在我的书的结尾):d – 2009-11-09 10:07:27

+1

我与鲁本同意 - 这将是明智引进一个新的类随身携带所有这些参数(你甚至可能想使用一个接口来给你更宽松的耦合)。换句话说,你会以'Func '这样的结尾结束,其中'IMyData'包含一堆(只读)属性。 – Groo 2009-11-09 10:41:02

回答

5

只需声明自己的代表 - 这只是一行代码。如果需要,请参阅my examples for declaring the .NET 3.5 delegates in .NET 2.0以获取某种模板。

我不知道这将如何与LINQ编译查询一起工作 - 希望这不会是一个问题,但您的用例不够明确,我可以肯定地说。

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

+0

谢谢jon,所以我认为如果.net 4.0会拥有多达8个参数,用5个参数创建我自己的Func并不是一个好主意。我应该把它命名为其他东西或至少把它放在它自己的命名空间中? – 2009-11-09 11:20:27

+0

@mark:这取决于你正在构建什么,以及你打算如何处理.NET 4.0。如果它是一个可以与不同版本的.NET一起工作的库,那就很棘手。如果它是一个可以通过删除委托声明“升级”一次的应用程序,那就更简单了。 – 2009-11-09 11:27:58

+0

感谢乔恩,多数民众赞成什么我会这样做只是删除委托当.net 4.0来到 – 2009-11-09 12:37:18

2

什么乔恩说,加...

正如你所建议的,一般你不应该结束了太多的PARAMS - 通常你应该找到一些共同点的概念跳出来告诉你Introduce Parameter Object。说了这么多,我不会放置一个'这只是疯狂的'路线。

+0

谢谢Ruben对你的评论,我会保持这个为未来!目前我只需要最多6个我认为 - 所以我认为它相当易于管理 – 2009-11-09 11:27:22

+0

嗨鲁本,我正在考虑使用你的技术,但在这个例子中,它创建了一个参数对象,类型为int,字符串等。你知道它是否可以使用一种通用版本,以便我可以使用这个对象来传递所有不同的类型。我可以将它指定为对象我想,但是然后我将需要Cast到实际类型? – 2009-11-09 13:10:10

+0

嗨马克,模式的例子的引用被编辑插入(感谢Groo!)。如果你想使用预定义的类,那更像是Tuples(它们在F#和.NET 4中)。 IPO的主要一点是,您要创建它代表了一组你传递partams,如背后的整体概念一个好名字一个新的类,而不是“标题,正文,拖车”你有一个'DocumentDefinition用属性或方法来包装它。没有什么能够阻止你使用Dictionary作为一个Bag来传递它们,但这是一种不同的方法。 – 2009-11-09 13:54:18