表达式目录树的拼接AND、Or、Not

表达式目录树的拼接AND、Or、Not

    • 表达式目录树的拼接AND、Or、Not
      • 1.利用ExpressionVisitor统一参数
      • 2. 合并表达式 expr1 AND expr2
      • 3. 合并表达式 expr1 or expr2
      • 4.Not

1.利用ExpressionVisitor统一参数

遍历表达式类型,当遇到参数类型表达式时,替换为我们自己定义的参数。

internal class NewExpressionVisitor : ExpressionVisitor
    {
        public ParameterExpression _NewParameter { get; private set; }
        public NewExpressionVisitor(ParameterExpression param)
        {
            this._NewParameter = param;
        }
        public Expression Replace(Expression exp)
        {
            return this.Visit(exp);
        }
        protected override Expression VisitParameter(ParameterExpression node)
        {
            return this._NewParameter;
        }
}

2. 合并表达式 expr1 AND expr2

public static Expressionbool>> And(this Expressionbool>> expr1, Expressionbool>> expr2)
        {
            if (expr1 == null)
                return expr2;
            else if (expr2 == null)
                return expr1;

            //return Expression.Lambda>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);
            ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
            NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);

            var left = visitor.Replace(expr1.Body);
            var right = visitor.Replace(expr2.Body);
            var body = Expression.And(left, right);
            return Expression.Lambdabool>>(body, newParameter);

        }

3. 合并表达式 expr1 or expr2

 public static Expressionbool>> Or(this Expressionbool>> expr1, Expressionbool>> expr2)
        {
            if (expr1 == null)
                return expr2;
            else if (expr2 == null)
                return expr1;

            ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
            NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);

            var left = visitor.Replace(expr1.Body);
            var right = visitor.Replace(expr2.Body);
            var body = Expression.Or(left, right);
            return Expression.Lambdabool>>(body, newParameter);
        }

4.Not

public static Expressionbool>> Not(this Expressionbool>> expr)
        {
            if (expr == null)
                return null;

            var candidateExpr = expr.Parameters[0];
            var body = Expression.Not(expr.Body);

            return Expression.Lambdabool>>(body, candidateExpr);
        }

你可能感兴趣的:(表达式目录树,c#)