首页 > 其他 > 详细

Expression笔记-ExpressionVisitor介绍及案例

时间:2020-01-01 15:21:23      阅读:102      评论:0      收藏:0      [点我收藏+]

介绍:

 

 

案例1:使用已有表达式树构建新的表达式树

Expression<Func<string, bool>> lambda0 = item => item.Length > 2;
Expression<Func<string, bool>> lambda1 = item => item.Length < 4;

将上面两个表达式合并成一个 item=>item.Length>&& item.Length<4 

不能直接使用下面这种方法构建新的表达式树,因为Body中带着之前的Parameter信息

public Func<string, bool> ReBuildExpression(Expression<Func<string, bool>> lambd0, Expression<Func<string, bool>> lambd1)
        {
            parameter = Expression.Parameter(typeof(string), "name");
            Expression left = lambd0.Body;
            Expression right = lambd1.Body;
            BinaryExpression expression = Expression.AndAlso(left, right);
            Expression<Func<string, bool>> lambda = Expression.Lambda<Func<string, bool>>(expression, parameter);
            return lambda.Compile();
        }

只能使用ExpressionVisitor修改表达式,将之前的Parameter替换成新的

public class SetParamExpressionVisitor : ExpressionVisitor
    {
        public ParameterExpression Parameter { get; set; }
        public SetParamExpressionVisitor() { }
        public SetParamExpressionVisitor(ParameterExpression parameter) {
            this.Parameter = parameter;
        }
        public Expression Modify(Expression exp)
        {
            return this.Visit(exp);
        }
        protected override Expression VisitParameter(ParameterExpression parameter)
        {
            return this.Parameter;
        }
    }
public static Func<string, bool> AndAlsoExpression(Expression<Func<string,bool>> exp1,Expression<Func<string, bool>> exp2)
        {
            var parameter = Expression.Parameter(typeof(string), "name");
            SetParamExpressionVisitor visitor = new SetParamExpressionVisitor(parameter);
            var newExp1 = visitor.Modify(exp1.Body);
            var newExp2 = visitor.Modify(exp2.Body);
            var newBodyExp = Expression.AndAlso(newExp1, newExp2);
            return Expression.Lambda<Func<string, bool>>(newBodyExp, parameter).Compile();
        }

调用:

Expression<Func<string, bool>> exp1 = item => item.Length > 2;
Expression<Func<string, bool>> exp2 = item => item.Length < 4;
Func<string,bool> func = AndAlsoExpression(exp1, exp2);
bool b = func("aaaa");//false

 

 

 

 

 

 

 

 

 

 

 

 

参考:https://www.cnblogs.com/FlyEdward/archive/2010/12/06/Linq_ExpressionTree7.html

未完待续...

Expression笔记-ExpressionVisitor介绍及案例

原文:https://www.cnblogs.com/fanfan-90/p/12128845.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!