有没有办法构建表达式< Func< T,bool>>来自表达式< Func< T>>?
比如上课
public class MyClass { public int Prop1{get;set;} public int Prop2{get;set;} public int Prop3{get;set;} }
如果表达式< Func< T>>是()=>新的MyClass {Prop2 = 5}然后结果应该是x => x.Prop2 == 5
如果表达式< Func< T>>是()=>新的MyClass {Prop1 = 1,Prop3 = 3}然后结果应为x => x.Prop1 == 1&& x.Prop3 == 3
换句话说,是否可以在运行时创建具有任意数量条件的func?
解决方法
像这样:
static Expression<Func<T,bool>> Munge<T>(Expression<Func<T>> selector) { var memberInit = selector.Body as MemberInitExpression; if (memberInit == null) throw new InvalidOperationException("MemberInitExpression is expected"); var p = Expression.Parameter(typeof(T),"x"); Expression body = null; foreach (MemberAssignment binding in memberInit.Bindings) { var comparer = Expression.Equal( Expression.MakeMemberAccess(p,binding.Member),binding.Expression); body = body == null ? comparer : Expression.AndAlso(body,comparer); } if (body == null) body = Expression.Constant(true); return Expression.Lambda<Func<T,bool>>(body,p); }