问题描述
给定一个方法 DoSomething
,它接受一个(无参数)函数并以某种方式处理它.有没有比下面的代码片段更好的方法来为带参数的函数创建重载"?
Given a method DoSomething
that takes a (parameterless) function and handles it in some way. Is there a better way to create the "overloads" for functions with parameters than the snippet below?
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);
}
推荐答案
如评论中所述,这是部分应用而不是柯里化.我写了一篇关于我对差异的理解的博客文章,人们可能会觉得有趣.
As noted in comments, this is partial application rather than currying. I wrote a blog post on my understanding of the difference, which folks may find interesting.
嗯,它并没有特别不同 - 但我会将柯里化部分与调用 DoSomething"部分分开:
Well, it's not particularly different - but I'd separate out the currying part from the "calling DoSomething" part:
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));
这样你就可以在其他情况下重用柯里化代码——包括你不想立即调用新返回的委托的情况.(例如,您可能想稍后再对其进行更多处理.)
That way you can reuse the currying code in other situations - including cases where you don't want to call the newly-returned delegate immediately. (You might want to curry it more later on, for example.)
这篇关于在 C# 中正确的柯里化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!