给定一个方法 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);
}
有帮助吗?

解决方案

编辑:正如评论中所指出的,这是部分应用而非currying。我写了一篇关于差异的博客文章,人们可能会感兴趣。

嗯,它并没有特别的不同 - 但是我将“curing”部分从“调用DoSomething”中分离出来。部分:

public static Func<TResult> Apply<TResult, TArg> (Func<TArg, TResult> func, TArg arg)
{
    return () => func(arg);
}

public static Func<TResult> Apply<TResult, TArg1, TArg2> (Func<TArg1, TArg2, TResult> func,
                                                          TArg1 arg1, TArg2 arg2)
{
    return () => func(arg1, arg2);
}

// etc

然后:

DoSomething(Apply(foo, 1));

这样你可以在其他情况下重用currying代码 - 包括你不想立即调用新返回的委托的情况。 (例如,您可能希望稍后再讨论它。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top