如何结合两个lambdas

可能重复:
在c#中组合两个lamba表达式

我有两个以下表达式:

Expression<Func> expr1 = s => s.Length == 5; Expression<Func> expr2 = s => s == "someString"; 

现在我需要将它们与OR结合起来。 像这样的东西:

 Expression.Or(expr1, expr2) 

有没有办法让这类似于上面的代码方式:

 expr1 || expr2 

我理解在这个例子中我可以把它组合起来:

 Expression<Func> expr = s => s.Length == 5 || s == "someString" 

但我不能在我的实际代码中这样做,因为我将expr1和expr2作为方法的参数。

要完成Eric的答案,请使用.NET 4中引入的新ExpressionVisitor而不是自定义重写器:

 internal class ParameterReplacer : ExpressionVisitor { private readonly ParameterExpression _parameter; protected override Expression VisitParameter(ParameterExpression node) { return base.VisitParameter(_parameter); } internal ParameterReplacer(ParameterExpression parameter) { _parameter = parameter; } } class Program { static void Main(string[] args) { Expression> expr1 = s => s.Length == 5; Expression> expr2 = s => s == "someString"; var paramExpr = Expression.Parameter(typeof(string)); var exprBody = Expression.Or(expr1.Body, expr2.Body); exprBody = (BinaryExpression) new ParameterReplacer(paramExpr).Visit(exprBody); var finalExpr = Expression.Lambda>(exprBody, paramExpr); } } 

问题是每个lambda中的“s”参数具有相同的名称和相同的类型,但它们是不同的参数。 参数具有引用标识 ,而不是值标识 。 简单地将现有表达式树的两个主体组合成第三个表达式树有效地:

 s => s1.Length == 5 || s2 == "somestring" 

这没有任何意义。 你想要做的是写一个访问者,用一个参数搜索和替换参数s,然后你将把它作为新lambda表达式的参数。

有关详细信息,请参阅此相关问题:

在c#中组合两个lambda表达式