Ну это легко строить такой метод, но это было бы использовать лямбда-выражения для осуществления:
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);
}
Продолжайте движение, насколько вы хотите - возможно, даже добавление методов для связывания нескольких аргументов в вызове.
Вы можете сделать все это без выражения лямбды, но это будет просто больше работы. Например:
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);
}
}
Это в основном то, что компилятор будет делать для вас автоматически с лямбда-выражения, так почему это самостоятельно?
В чем проблема w/lambdas? –
@PhilipPittle ничего, но мне не хватает boost :: bind aka std :: bind из C++ тоже. Это просто еще один «случай использования» (imho). –
http://www.boost.org/doc/libs/1_62_0/libs/bind/doc/html/bind.html –