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});//生成表达式树,这个委托可以在外部进行编译调用