如何在 c# 中组合两个类型为“委托”的 lambda

本文关键字:类型 两个 委托 lambda 组合 | 更新日期: 2023-09-27 17:56:45

假设我们已经定义了两个 Lambda。

Func<TInput, TOutput> a = …;
Func<TInput1, TInput2, TOutput> b = …;

现在让我们假设我们有一些代码不适用于泛型,并将这些 Lambda 作为未进一步类型化的委托接收。

delegate da = a;
delegate db = b;

在该代码中,我们希望将两个 lambdas/委托组合为一个新的、组合的 lambda,例如 (i1, i2) => b(a(i1), i2),但 a 和 b 不可访问,只有 da 和 db 可访问。如何以优雅的方式做到这一点?

如何在 c# 中组合两个类型为“委托”的 lambda

这是你想要的吗?

Func<int, int> a = p0 => p0 << 1;
Func<int, int, int> b = (p0, p1) => p0 + p1;
Delegate da = a;
Delegate db = b;
var inner = da.Method.GetParameters().Length < db.Method.GetParameters().Length ? da : db;
var outer = inner == da ? db : da;
Func<int, int, int> c = (i1, i2) => (int)outer.DynamicInvoke(inner.DynamicInvoke(i1), i2);

我更愿意创建一个表达式树来构建一个根据需要创建的新 lambda。也许需要更多的逻辑来确定哪个参数应该传递给a以及a的结果在哪个参数传递给b

这是你想走的路吗?