【问题标题】:Bind function (delegate) arguments绑定函数(委托)参数
【发布时间】:2014-12-02 13:44:22
【问题描述】:

我正在尝试在不使用 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# 中可以吗?

【问题讨论】:

  • lambda 有什么问题?
  • @PhilipPittle 什么都没有,但我也缺少来自 C++ 的 boost::bind aka std::bind。这只是另一个“用例”(恕我直言)。
  • 再想一想:用 bind 绑定值,用 lambda 分配变量,如果变量的值在外部范围内发生变化,它也会在 (lambda) 内部范围内发生变化,所以差别很大

标签: c# lambda callback delegates bind


【解决方案1】:

嗯,构建这样的方法很容易,但是会使用 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 表达式自动为您做的事情,那么为什么要自己做呢?

【讨论】:

  • 老实说,这有什么意义(在这种特殊情况下)?
  • @J.Steen:我认为在某些情况下,如果您将意图表达为显式绑定调用,则可能会更清楚 - 但差别不大。
  • 重点是我想知道 Type.InvokeMember 如何将 object[] args 绑定到函数。
  • @JobNick:大概它会查看签名并通过反射完成所有操作。我看不出你问的问题与Type.InvokeMember 有什么关系 - 它是一种不同的“绑定”,实际上,它是立即调用方法,而不是执行部分功能应用程序。
  • @JobNick 您的问题所以不清楚。 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多