【发布时间】:2015-06-17 07:30:27
【问题描述】:
假设我们已经定义了两个 Lambda。
Func<TInput, TOutput> a = …;
Func<TInput1, TInput2, TOutput> b = …;
现在让我们假设我们有一些代码不适用于泛型,并接收这些 Lambda 作为非进一步类型化的委托。
delegate da = a;
delegate db = b;
在该代码中,我们希望将两个 lambdas / delegates 组合成一个新的组合 lambda,例如(i1, i2) => b(a(i1), i2),但是 a 和 b 不可访问,只有 da 和 db 可访问。如何以优雅的方式做到这一点?
【问题讨论】:
-
您的意思是
Delegate,即System.Delegate?你为什么不直接DynamicInvoke? -
我的意思是
System.Delegate。我不想调用它,我想传递组合委托。 -
我的意思是
(i1, i2) => b(a(i1), i2)应该变成(i1, i2) => db.DynamicInvoke(da.DynamicInvoke(i1), i2)之类的东西,但我看到 Vera rind 在下面的回答中已经涵盖了这一点。当你有强类型时,比如a,你可以说a(i1)(与a.Invoke(i1)相同),因为签名在编译时是已知的。当您只有System.Delegate时,您需要da.DynamicInvkoe(i1)。如果参数计数(和类型)正确,则无法在编译时检查。