Job*_*ick 5 c# lambda delegates bind callback
我试图在不使用 lambda 函数的情况下实现以下目标:
Func<bool> test = () => RunSomething("test"); <-- This work fine but creates lambda
Func<bool> test = bind(RunSomething, "test"); <-- Bind "test" to RunSomething
Run Code Online (Sandbox Code Playgroud)
换句话说,我想知道是否有可能以某种方式绑定函数和参数。
在 C++ 中使用 std::bind 是可能的,但在 C# 中可能吗?
好吧,构建这样的方法很容易,但这将使用 lambda 表达式来实现:
public Func<TResult> Bind<T, TResult>(Func<T, TResult> func, T arg)
{
return () => func(arg);
}
Run Code Online (Sandbox Code Playgroud)
同样,对于具有更多参数的函数也有一些重载:
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);
}
Run Code Online (Sandbox Code Playgroud)
随心所欲地继续前进 - 甚至可能添加方法以在调用中绑定多个参数。
您可以在没有 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);
}
}
Run Code Online (Sandbox Code Playgroud)
这基本上就是编译器会使用 lambda 表达式自动为您做的事情,那为什么要自己做呢?
| 归档时间: |
|
| 查看次数: |
10119 次 |
| 最近记录: |