给定一个DoSomething
采用(无参数)函数的方法并以某种方式处理它.有没有更好的方法为参数的函数创建"重载"而不是下面的代码片段?
public static TResult DoSomething(Func func) { //call func() and do something else } public static TResult DoSomething ( Func func, T0 arg0) { return DoSomething(() => func(arg0)); } public static TResult DoSomething ( Func func, T0 arg0, T1 arg1) { return DoSomething(arg => func(arg, arg1), arg0); } public static TResult DoSomething ( Func func, T0 arg0, T1 arg1, T2 arg2) { return DoSomething(arg => func(arg, arg1, arg2), arg0); }
Jon Skeet.. 31
编辑:如评论中所述,这是部分应用而不是currying.我写了一篇关于我对差异的理解的博客文章,人们可能会感兴趣.
嗯,它并没有特别的不同 - 但我将currying部分与"调用DoSomething"部分区分开来:
public static FuncApply (Func func, TArg arg) { return () => func(arg); } public static Func Apply (Func func, TArg1 arg1, TArg2 arg2) { return () => func(arg1, arg2); } // etc
然后:
DoSomething(Apply(foo, 1));
这样,您可以在其他情况下重用currying代码 - 包括您不想立即调用新返回的委托的情况.(例如,您可能希望稍后再讨论它.)
编辑:如评论中所述,这是部分应用而不是currying.我写了一篇关于我对差异的理解的博客文章,人们可能会感兴趣.
嗯,它并没有特别的不同 - 但我将currying部分与"调用DoSomething"部分区分开来:
public static FuncApply (Func func, TArg arg) { return () => func(arg); } public static Func Apply (Func func, TArg1 arg1, TArg2 arg2) { return () => func(arg1, arg2); } // etc
然后:
DoSomething(Apply(foo, 1));
这样,您可以在其他情况下重用currying代码 - 包括您不想立即调用新返回的委托的情况.(例如,您可能希望稍后再讨论它.)