动态表达式树(Expression Tree)来实现动态筛选

   1)、根据给定的属性名和属性值来筛选procUnits列表中的元素,并将满足条件的元素存储在procUnits列表中。

 var ProcUnitType="IsCost";
 procUnitTypes = procUnits.MapToList<ProcUnitType>();
                var property = typeof(ProcUnitType)
                         .GetProperty(ProcUnitType, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                if (property != null && property.PropertyType == typeof(int))
                {
                    var parameter = Expression.Parameter(typeof(ProcUnitType));
                    var condition = Expression.Equal(Expression.Property(parameter, property), Expression.Constant(1));
                    var lambda = Expression.Lambda<Func<ProcUnitType, bool>>(condition, parameter);
                    var filter = lambda.Compile();
                    procUnitTypes = procUnitTypes.Where(filter).ToList();
                }

通过使用Expression.Parameter创建了一个表示Lambda表达式中参数的参数表达式。然后,使用Expression.Property创建了一个表示属性访问的表达式,将参数表达式和属性名传递给它。接下来,使用Expression.Constant创建了一个表示常量值的表达式,将属性值1传递给它。最后,使用Expression.Equal创建了一个表示等式比较的表达式,将属性访问表达式和常量值表达式传递给它。

通过这些表达式的组合,我们构建了一个Lambda表达式,它表示了一个条件,要求属性的值等于1。然后,使用Expression.Lambda将这个Lambda表达式编译为一个委托,可以用于筛选列表。

最后,使用Where方法和编译的委托对procUnitTypes列表进行筛选,将符合条件的元素保留下来。

2)、构建表达式树表示:a.Length > b || b >= 0

ParameterExpression parA=Expression.Parameter(typeof(string),"a");//参数a  

ParameterExpression parB=Expression.Parameter(typeof(int),"b");//参数B  
  
var left=Expression.GreaterThan(Expression.Prototype(parA,"length"),parB);  
//取得参数A的length属性,用>连接B进行对比    

var rigfht=Expression.GreaterThanOrEqual(parB,Expression.Constant(0));//将参数b用>=连接常量表达式    

var body=Expression.Or(left,right);//最后 左右两边表达式 用Or运算进行连接表示逻辑或    

var lambda = Expression.Lambda<Func<string, int, bool>>(body,new ParameterExpression[]{parA,parB});//生成表达式树,这个委托可以在外部进行编译调用 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,我们可以使用表达式动态构建Lambda表达式表达式是一种数据结构,它可以表示Lambda表达式本身,而不是Lambda表达式的结果。我们可以通过构建表达式来描述Lambda表达式的结构和行为,然后将其编译为可执行的代码。 下面是一些示例代码,演示了如何使用表达式来构建Lambda表达式: ```csharp // 创建一个参数表达式 ParameterExpression param = Expression.Parameter(typeof(int), "x"); // 创建一个常量表达式 ConstantExpression constExp = Expression.Constant(10, typeof(int)); // 创建一个加法表达式 BinaryExpression addExp = Expression.Add(param, constExp); // 创建一个Lambda表达式 Expression<Func<int, int>> lambdaExp = Expression.Lambda<Func<int, int>>(addExp, param); // 编译Lambda表达式 Func<int, int> func = lambdaExp.Compile(); // 调用Lambda表达式 int result = func(5); // 结果为 15 ``` 在上面的代码中,我们首先创建了一个参数表达式 `param`,表示Lambda表达式的参数。然后,我们创建了一个常量表达式 `constExp`,表示加法运算中的常量值。接着,我们使用这两个表达式创建了一个加法表达式 `addExp`。最后,我们使用 `Expression.Lambda` 方法构建了一个Lambda表达式,并将其编译为可执行的代码。 需要注意的是,使用表达式构建Lambda表达式时,我们需要明确指定Lambda表达式的参数和返回值类型。在上面的示例中,我们使用了 `Expression.Lambda<Func<int, int>>` 来表示参数类型为 `int`,返回值类型也为 `int` 的Lambda表达式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值