c# – 如何从Expression>构建Expression>

前端之家收集整理的这篇文章主要介绍了c# – 如何从Expression>构建Expression>前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法构建表达式< 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);
}

猜你在找的C#相关文章