C# 两个表达式的Get和<;谓词<;字符串>&燃气轮机;物体
我需要将Expression>动态构建为Expression>对象的连接,例如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<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
的好方法