绑定函数(委托)参数

时间:2014-12-02 13:44:23

标签: c# lambda callback delegates bind

我试图在不使用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#中是否可能?

2 个答案:

答案 0 :(得分: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表达式为你做的,为什么要自己做?

答案 1 :(得分:0)

我遇到了这个要求,最后,我只添加了我想绑定到构造函数的信息。显然,如果您无权访问构造对象的绑定数据,则此方法将无效。