2014-12-02 59 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