如何从Expression <Func <T >>构建Expression <Func <T,bool >>

Vla*_*adK 6 .net c# linq linq-expressions

有没有办法建立Expression<Func<T,bool>>起来Expression<Func<T>>

比如上课

public class MyClass
{
    public int Prop1{get;set;}
    public int Prop2{get;set;}
    public int Prop3{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

如果Expression<Func<T>>() => new MyClass{Prop2 = 5}那么结果应该是x => x.Prop2 == 5

如果Expression<Func<T>>() => new MyClass{Prop1 = 1, Prop3 = 3}那么结果应该是x => x.Prop1 == 1 && x.Prop3 == 3

换句话说,是否可以在运行时创建具有任意数量条件的func?

Mar*_*ell 7

像这样:

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);
}
Run Code Online (Sandbox Code Playgroud)