我可以动态创建一个 Expression<Func<T, bool>> 谓词,但是如何创建 Expression<Func<T1,T2,bool>>?

3

这个链接中我可以动态创建一个表达式 <Func<T, bool>> 谓词(predicate)

这段代码可以动态创建 s=>s.Id == 1 的谓词(predicate)

ParameterExpression argParam = Expression.Parameter(typeof(User), "s");
var propertyExp = Expression.Property(parameterExp, "Id");
var constExp = Expression.Constant(1);

var body = Expression.Equal(propertyExp, constExp);
var lambda = Expression.Lambda<Func<User, bool>>(body, parameterExp);

但是我怎么创建 Expression < Func< T1,T2,bool>> 和 Expression < Func< T1,T2,T3,bool>> 呢?

如何动态地创建像这样的表达式:(a,b)=> a.Id==1 && b.Name == "name"


1
这个表达式应该做什么?请编辑您的问题并添加一个示例(包括静态lambda或伪代码)。 - Aleks Andreev
动态创建如下:(a,b)=> a.Id== 1 && b.Name == "name" - try
1个回答

3
Func<T, bool>Func<T1, T2, bool>的区别在于后者接受两个参数,因此您需要使用Expression.Parameter创建两个参数。

以下代码将创建一个表达式

(t1, t2) => t1.Id == 1 && t2.Name == name;

private static Expression<Func<T1, T2, bool>> CreateExpression<T1, T2>()
{
    var t1 = Expression.Parameter(typeof(T1), "t1");
    var t2 = Expression.Parameter(typeof(T2), "t2");

    var idProp = Expression.PropertyOrField(t1, "Id");
    var nameProp = Expression.PropertyOrField(t2, "Name");

    var body = Expression.AndAlso(
        Expression.Equal(idProp, Expression.Constant(1)),
        Expression.Equal(nameProp, Expression.Constant("name"))
    );

    var lambda = Expression.Lambda<Func<T1, T2, bool>>(body, t1, t2);
    return lambda;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接