C# 两个表达式的Get和<;谓词<;字符串>&燃气轮机;物体

C# 两个表达式的Get和<;谓词<;字符串>&燃气轮机;物体,c#,expression,expression-trees,predicate,C#,Expression,Expression Trees,Predicate,我需要将Expression>动态构建为Expression>对象的连接,例如 Expression<Predicate<string>> expression1 = c => c.Contains("aaa"); Expression<Predicate<string>> expression2 = c => c.Contains("bbb"); expression1=c=>c.Contains(“aaa”); 表达式expres

我需要将Expression>动态构建为Expression>对象的连接,例如

Expression<Predicate<string>> expression1 = c => c.Contains("aaa");
Expression<Predicate<string>> expression2 = c => c.Contains("bbb");
expression1=c=>c.Contains(“aaa”);
表达式expression2=c=>c.Contains(“bbb”);
如何将这些表达式与AND运算符组合以获得另一个表达式

Expression<Predicate<string>>
表达式
反对

谢谢

expression1=c=>c.Contains(“aaa”)和&c.Contains(“bbb”);
Expression<Predicate<string>> expression1 = c => c.Contains("aaa") && c.Contains("bbb");
上述措施将起作用,而且应该始终是可行的。但是,如果出于某种原因尝试将这些谓词进行一般组合,请尝试以下操作:

Expression<Predicate<string>> expression1 = c => c.Contains("aaa");
Expression<Predicate<string>> expression2 = c => c.Contains("bbb");
Expression<Predicate<string>> expression3 = Expression.AndAlso(expression1.body , expression2.body); 
expression1=c=>c.Contains(“aaa”);
表达式expression2=c=>c.Contains(“bbb”);
表达式expression3=Expression.AndAlso(expression1.body,expression2.body);
此外,以下是相关文档: 你会发现其他类似的有用的表达式成员

<代码> var PAR=Expal.参数(Type of(String));
var par = Expression.Parameter(typeof(string));
Expression<Predicate<string>> expression3 = 
    Expression.Lambda<Predicate<string>>(
        Expression.AndAlso(
            Expression.Invoke(expression1, par), 
            Expression.Invoke(expression2, par)), 
        par);

Predicate<string> method1 = expression3.Compile();
Console.WriteLine(method1("aaa"));
Console.WriteLine(method1("bbb"));
Console.WriteLine(method1("aaabbb"));
表达式表达式3= Lambda( 安达尔索( Expression.Invoke(expression1,par), Expression.Invoke(expression2,par)), 标准杆); 谓词method1=expression3.Compile(); 控制台写入线(方法1(“aaa”); 控制台写入线(方法1(“bbb”); 控制台写入线(方法1(“aaabb”); 我们必须创建一个新的表达式
par
是参数。然后我们使用
Expression.Invoke
来调用“旧”表达式(并将
par
作为其参数传递)。然后我们使用
Expression.AndAlso
生成
&
表达式。最后,我们使用
Expression.Lambda
创建最终表达式(最后一个参数
par
是Lambda表达式的参数名称)


请注意(常见错误)
Expression.和
&
,而
Expression.和
也是
&
(与
表达式或*
相同)

您基本上可以使用
谓词builder
执行操作,但是使用
谓词
,而不是它使用的
函数

public static Expression<Predicate<string>> And(this Expression<Predicate<string>> expr1,
                                                Expression<Predicate<string>> expr2)
{
    var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
    return Expression.Lambda<Predicate<string>>
            (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
公共静态表达式和(此表达式expr1,
表达式expr2)
{
var invokedExpr=Expression.Invoke(expr2,expr1.Parameters.Cast());
返回表达式.Lambda
(Expression.AndAlso(expr1.Body,invokedExpr),expr1.Parameters);
}

如果您不介意使用
Func
而不是
Predicate
,那么您可以直接使用。

您没有调用谓词。不,请查看其他答案。您不能在调用之前将它们合并吗?在调用之前,您应该能够等待获得andAlso表达式。
expression.andAlso(expression1.body,expression2.body)
不起作用,因为它们有不同的参数(就像expression1是
c=>c
而expression2是
d=>d
),这是重用
expr1
的好方法