大家好,由于今天项目升级,大家都在获最新代码,所以我又有时间在这里写点东西,跟大家分享。

      在上一篇的文章中我介绍了一个dll,使大家在debug的时候可以可视化的看到ExpressionTree的Body和Parameter。今天这篇文章主要讲一个问题——如何利用一个已有的表达式树的body来构建一个新的表达式树。      不多说废话,现在开始进入正题。

      假设我们要写一个像下面这样的方法:

     

 public Func<string, bool> ReBuildExpression(Expression<Func<string, bool>> lambd0, Expression<Func<string, bool>> lambd1)

 

 

       这个方法的用意很简单,就是把传入的两个参数为string类型,返回类型为bool的方法做一个且的关系,构建出一个新的以string为参数,返回类型为bool的方法。

       举个例子,如果传入的lambd0,lambd1为如下谓语表达式:

      

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

 

 

      那么,我们希望ReBuildExpression这个方法返回的谓语表达式为item=>item.Length>2&&item.Length<4。

      通过上一篇的介绍我们知道,对于一个表达式树来说,我们可以把它分为2部分——body和parameter,逻辑在body,参数在parameter,那么很自然的,我们想到采用如下方式来实现这个方法:

     

Linq系列(7)——表达式树之ExpressionVisitor
        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();
        }
Linq系列(7)——表达式树之ExpressionVisitor

相关文章: