嗯,这很容易build这样的方法,但是会使用 lambda 表达式来实现:
public Func<TResult> Bind<T, TResult>(Func<T, TResult> func, T arg)
{
return () => func(arg);
}
同样,一些带有更多参数的函数的重载:
public Func<T2, TResult> Bind<T1, T2, TResult>
(Func<T1, T2, TResult> func, T1 arg)
{
return t2 => func(arg, t2);
}
public Func<T2, TResult> Bind<T1, T2, T3, TResult>
(Func<T1, T2, T3, TResult> func, T1 arg)
{
return (t2, t3) => func(arg, t2, t3);
}
继续按照您想要的方式进行 - 甚至可能添加方法来绑定调用中的多个参数。
You can无需使用 lambda 表达式即可完成所有这些工作,但这只会增加更多工作量。例如:
public Func<TResult> Bind<T, TResult>(Func<T, TResult> func, T arg)
{
return new Binder<T, TResult>(func, arg).Apply;
}
private sealed class Binder<T, TResult>
{
private readonly T arg;
private readonly Func<T, TResult> func;
internal Binder(Func<T, TResult> func, T arg)
{
this.func = func;
this.arg = arg;
}
public TResult Apply()
{
return func(arg);
}
}
这基本上就是编译器使用 lambda 表达式自动为您做的事情,那么为什么要自己做呢?