那么它很容易构建这样的方法,但会使用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);
}
继续按照你的想法 - 甚至可能添加方法来绑定调用中的多个参数。
你可以做所有这些没有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表达式为您做的,那么为什么要自己做?
w/lambdas有什么问题? – 2014-12-02 13:45:36
@PhilipPittle什么都没有,但我错过了boost :: bind aka std :: bind也是来自C++。这只是另一个“用例”(imho)。 – 2017-03-22 16:22:51
http://www.boost.org/doc/libs/1_62_0/libs/bind/doc/html/bind.html – 2017-03-22 16:28:10