绑定函数(委托)参数

2023-11-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# 中可能吗?


嗯,这很容易build这样的方法,但是会使用 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);
}

继续按照您想要的方式进行 - 甚至可能添加方法来绑定调用中的多个参数。

You can无需使用 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 表达式自动为您做的事情,那么为什么要自己做呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绑定函数(委托)参数 的相关文章