那麼它很容易構建這樣的方法,但會使用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