C# C语言中的正确咖喱#

C# C语言中的正确咖喱#,c#,lambda,currying,C#,Lambda,Currying,给定一个方法DoSomething,该方法接受一个(无参数)函数并以某种方式处理它。有没有比下面的代码段更好的方法来为带有参数的函数创建“重载” public static TResult DoSomething<TResult>(Func<TResult> func) { //call func() and do something else } public static TResult DoSomething<T0, TResult>(

给定一个方法
DoSomething
,该方法接受一个(无参数)函数并以某种方式处理它。有没有比下面的代码段更好的方法来为带有参数的函数创建“重载”

public static TResult DoSomething<TResult>(Func<TResult> func)
{
    //call func() and do something else
}

public static TResult DoSomething<T0, TResult>(
    Func<T0, TResult> func,
    T0 arg0)
{
    return DoSomething(() => func(arg0));
}

public static TResult DoSomething<T0, T1, TResult>(
    Func<T0, T1, TResult> func,
    T0 arg0, T1 arg1)
{
    return DoSomething(arg => func(arg, arg1), arg0);
}

public static TResult DoSomething<T0, T1, T2, TResult>(
    Func<T0, T1, T2, TResult> func,
    T0 arg0, T1 arg1, T2 arg2)
{
    return DoSomething(arg => func(arg, arg1, arg2), arg0);
}
public static TResult DoSomething(Func-Func)
{
//调用func()并执行其他操作
}
公共静态结果剂量测量(
Func Func,
T0 arg0)
{
返回剂量测量(()=>func(arg0));
}
公共静态结果剂量测量(
Func Func,
T0 arg0,T1 arg1)
{
返回DoSomething(arg=>func(arg,arg1),arg0);
}
公共静态结果剂量测量(
Func Func,
T0 arg0、T1 arg1、T2 arg2)
{
返回DoSomething(arg=>func(arg,arg1,arg2),arg0);
}

编辑:如评论中所述,这是部分应用,而不是套用。我写了一篇文章,大家可能会觉得有趣

嗯,这并没有什么特别的不同——但我要将咖喱部分与“呼叫DoSomething”部分分开:


这样,您就可以在其他情况下重用当前代码,包括不想立即调用新返回的委托的情况。(例如,你以后可能会更喜欢它。)

Jon Skeet的答案是正确的,但是手工编写所有可能的重载是疯狂的,所以你可以使用这样的库为你完成这项工作。Curryfy lib特别公开了Curry、UnCurry和ApplyPartial扩展方法,并带有大量重载。

以下是允许使用
动态
编写无限函数调用的方法(如js中的Curry):

动态和(int a)
{
控制台写入线(a);
返回新的Func(b=>Sum(a+b));
}
如果您这样调用Sum(2)(3)(4)(10)

2
5
9
19

为什么返回Func而不是Func?因为Func是您希望能够传递到DoSomething中的内容。其思想是Curry方法应该采用一个采用一些参数以及这些参数值的函数,并返回一个采用较少参数的函数(在本例中为0)。我认为应该将Func转换为参数较少的函数Func。您可以创建一个带有许多参数和货币变量的默认dosomething,我同意Paco。IMO此解决方案不适用于部分应用程序,而不适用于当前应用程序。看,我看到这里甚至有一个问题,所以要消除歧义:你看过这篇博文了吗?如果你想在Wesdayer链接中使用C:+1,这里有几个帖子可能会很有趣——如果你还阅读了相关的Fibonacci帖子:msdn链接断开了,你会对一些不太容易理解的概念有一个真正坚实的理解。
DoSomething(Apply(foo, 1));
2
5
9
19