2014-12-02 57 views
2

我試圖實現不使用lambda函數如下:綁定功能(委託)參數

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有什麼問題? – 2014-12-02 13:45:36

+0

@PhilipPittle什麼都沒有,但我錯過了boost :: bind aka std :: bind也是來自C++。這只是另一個「用例」(imho)。 – 2017-03-22 16:22:51

+0

http://www.boost.org/doc/libs/1_62_0/libs/bind/doc/html/bind.html – 2017-03-22 16:28:10

回答

4

那麼它很容易構建這樣的方法,但會使用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表達式爲您做的,那麼爲什麼要自己做?

+0

而且,說實話,在這個特殊情況下會有什麼意義? – 2014-12-02 13:50:46

+0

@ J.Steen:我認爲如果您將其表述爲明確的綁定調用,則可能會出現意圖更清晰的情況 - 但這並不是很大的區別。 – 2014-12-02 13:52:44

+0

重點是我想知道Type.InvokeMember如何綁定對象[]參數的功能。 – JobNick 2014-12-02 13:53:51