C# 如何创建;系统Linq.Expression“;带括号的动态表达式
我需要动态创建表达式。我的问题是如何在System.Linq.Expression中添加括号来处理优先级C# 如何创建;系统Linq.Expression“;带括号的动态表达式,c#,linq,dynamic,expression,C#,Linq,Dynamic,Expression,我需要动态创建表达式。我的问题是如何在System.Linq.Expression中添加括号来处理优先级 inta=1,b=1,c=1,d=2 我已将下面的表达式转换为 var v = a > 1 || b > 1 && c > 1 || d > 1; Expression case1Expr = Expression.AndAlso( Expression.OrElse(
inta=1,b=1,c=1,d=2代码>
我已将下面的表达式转换为
var v = a > 1 || b > 1 && c > 1 || d > 1;
Expression case1Expr =
Expression.AndAlso(
Expression.OrElse(
Expression.GreaterThan(Expression.Parameter(typeof(int), "a"), Expression.Constant(1)),
Expression.GreaterThan(Expression.Parameter(typeof(int), "b"), Expression.Constant(1))),
Expression.OrElse(
Expression.GreaterThan(Expression.Parameter(typeof(int), "c"), Expression.Constant(1)),
Expression.GreaterThan(Expression.Parameter(typeof(int), "d"), Expression.Constant(1))));
但是如何转换一个带括号的
var v2 = (a > 1 || b > 1) && (c > 1 || d > 1);
我可能错过了你的问题,但你会不会:
Expression first = Expression.OrElse(
Expression.GreaterThan(Expression.Parameter(typeof(int), "a"), Expression.Constant(1)),
Expression.GreaterThan(Expression.Parameter(typeof(int), "b"), Expression.Constant(1)));
Expression second = Expression.OrElse(
Expression.GreaterThan(Expression.Parameter(typeof(int), "c"), Expression.Constant(1)),
Expression.GreaterThan(Expression.Parameter(typeof(int), "d"), Expression.Constant(1)));
Expression final = Expression.AndAlso(first, second);
结果是:((a>1)或(b>1))和((c>1)或(d>1))
您已经拥有这些语义的代码。当您调用ToString
查看您拥有的确切代码时,您会得到以下信息:
(((a > 1) OrElse (b > 1)) AndAlso ((c > 1) OrElse (d > 1)))
不需要特定的表达式来表示括号;括号在编写表达式时是隐式的。在代码中,您将或表达式传递给和表达式,因此或表达式将被括起来。您可以通过构建表达式树的方式指定优先级。&&
运算符通常优先于|
运算符,因此您的转换将应用于带括号的表达式。否则就只会是:
var v = a > 1 || b > 1 && c > 1 || d > 1;
OrElse(
GreaterThan(a > 1),
OrElse(
AndAlso(
GreaterThan(b > 1),
GreaterThan(c > 1)),
GreaterThan(d > 1)))
只是对其他答案进行一点扩展;我们需要用括号来保持用来描述方程(A OP B)的中缀符号不含糊。其他符号,例如后缀(abop),不需要它
在您的例子中,您正在构建一个表达式树,它也是明确的,也就是说,只有一种方法可以解释它。所以表达式树中没有括号的概念。树的“形状”决定了操作的顺序。这正是OP已经在做的事情;没有必要把这些值放在命名变量中。在问了这个问题之后,我也意识到了这一点,尝试一下out@Servy同意。我只是想说清楚。米兰,你可能想删除这个问题,因为你已经找到了答案