2015-01-09 23 views
1

我需要動態創建表達式。我的問題是如何增加括號中System.Linq.Expression處理優先級...如何用圓括號動態創建「System.Linq.Expression」表達式

int a = 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); 

回答

-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) OrElse (b > 1)) AndAlso ((c > 1) OrElse (d > 1)))

+0

這正是OP已經在做的事情;沒有必要將值放入命名變量中。 – Servy 2015-01-09 20:04:35

+0

提問後我也意識到,試一試 – 2015-01-09 20:04:54

+0

@Servy同意。爲了清晰起見,我只是將其分解出來。米蘭,你可能想刪除這個問題,因爲你已經有了解決方案! :) – AlG 2015-01-09 20:21:47

0

,你已經擁有這些語義的代碼。當你確切的代碼中調用ToString,你有你這樣的:

(((a > 1) OrElse (b > 1)) AndAlso ((c > 1) OrElse (d > 1))) 

無需特定的表達來表示括號;圓括號隱含在您編寫表達式的方式中。在您的代碼中,您將Or表達式傳遞給And表達式,因此Or表達式將被括起來。

0

您可以通過構建表達式樹來指定優先順序。運算符&&通常優先於||運算符,因此您的轉換將應用於帶圓括號的表達式。否則它只是:

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))) 
2

只是爲了擴大一點在其他答案;圓括號是我們需要保持用於描述方程(A OP B)不明確的符號的記號。其他符號,如後綴(A B OP),不需要它。

就你而言,你將放在一起的表達式樹也是明確的,即只有一種解釋方式。所以在表達式樹中沒有括號的概念。樹的「形狀」決定了操作的順序。

相關問題