2013-01-14 36 views
2

我有這樣的代碼,其生產出乘mynumber的5在運行時更改表達式委託體?

ParameterExpression numParam = Expression.Parameter(typeof(int), "num"); 
ConstantExpression five = Expression.Constant(5, typeof(int)); 
BinaryExpression numMultiply = Expression.Multiply(numParam,five); 

讓我們創建委託的委託:

Expression<Func<int, int>> lambda1 = 
    Expression.Lambda<Func<int, int>>(
     numMultiply, 
     new ParameterExpression[] { numParam }); 
Console.Write(lambda1.Compile()(4)); 
現在

比方說,我想這個表達式樹變成Add而不是Multiply
這裏是新行:

BinaryExpression numAdd = Expression.Add(numParam,five); 

但是,如何更改lambda1以便它現在將使用numAdd而不是multiply

+1

'Expression'是不可變的;沒有辦法可以改變它。你唯一能做的就是根據你想要的改變創建一個新的Expression,並確保相關的變量引用新的Expression。 – Servy

回答

5

你只是建立一個新的,並編譯它。

Expression<Func<int, int>> lambda1 = 
    Expression.Lambda<Func<int, int>>(
     numAdd, 
     new ParameterExpression[] { numParam }); 

MSDN page

表達式樹應該是一成不變的。這意味着如果要修改表達式樹,則必須通過複製現有表達式樹並替換其中的節點來構造新的表達式樹。您可以使用表達式樹訪問器來遍歷現有的表達式樹。

「應該」這個短語有點奇怪,但是當您查看API時,您會看到所有相關屬性(Body,Left,Right)都是隻讀的。

+0

無法修改現有的? –

+0

我以爲這就是ecpression樹的力量,所以我可以改變行爲.... –

+0

你試過重新分配'numMultiply',然後再次編譯表達式?在這種情況下,你應該把'numMultiply'重命名爲像'operation'這樣更通用的東西。 – Ameen