c# - 如何合并两个 lambda

标签 c# .net expression-trees

<分区>

Possible Duplicate:
combining two lamba expressions in c#

我有以下两个表达式:

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

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

Expression.Or(expr1, expr2)

有什么方法可以使它类似于上面的代码方式:

expr1 || expr2

我明白在这个例子中我可以首先将它组合起来:

Expression<Func<string, bool>> 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<Func<string, bool>> expr1 = s => s.Length == 5;
        Expression<Func<string, bool>> 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<Func<string, bool>>(exprBody, paramExpr);
    }

}

关于c# - 如何合并两个 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6736505/

相关文章:

c# - 如何在 C# 正则表达式中将数字与空格和换行匹配?

c# - 重用上下文菜单

c# - HTTP 错误 500.52 - URL 重写模块错误。名称属性

c# - 超过 16 字节的结构的最佳解决方案

c# - 从客户端应用程序自动安全地登录 Web

c# - 在 ASP.NET MVC 包中使用 CDN

c# - 如何创建比较子对象中属性的表达式树?

javascript 无效的正则表达式 无效的组

c# - 将 IQueryable<T> 或 LINQ 查询转换为唯一字符串

c# - ExpressionTree 作为方法参数接受任何方法