2014-12-02 5 views
2

Я пытаюсь добиться следующего без использования функции лямбда:Bind функция (делегат) аргументы

Func<bool> test =() => RunSomething("test"); <-- This work fine but creates lambda 
Func<bool> test = bind(RunSomething, "test"); <-- Bind "test" to RunSomething 

Другими словами, которыми я хочу знать, если это возможно, каким-то образом связать функции и аргументы.
Это возможно в C++ с использованием std :: bind, но возможно ли это на C#?

+5

В чем проблема w/lambdas? –

+0

@PhilipPittle ничего, но мне не хватает boost :: bind aka std :: bind из C++ тоже. Это просто еще один «случай использования» (imho). –

+0

http://www.boost.org/doc/libs/1_62_0/libs/bind/doc/html/bind.html –

ответ

4

Ну это легко строить такой метод, но это было бы использовать лямбда-выражения для осуществления:

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); 
    } 
} 

Это в основном то, что компилятор будет делать для вас автоматически с лямбда-выражения, так почему это самостоятельно?

+0

И, честно говоря, какой был бы смысл (в данном конкретном случае)? –

+0

@ J.Steen: Я думаю, что могут быть случаи, когда намерение становится яснее, если вы выражаете его как явный вызов привязки - но это не большая разница. –

+0

Дело в том, что я хочу знать, как Type.InvokeMember связывает объект [] args с функцией. – JobNick

Смежные вопросы