2011-12-22 111 views
10

我想知道如何在表達式樹中的參數綁定到值綁定參數

喜歡的東西

Expression<Func<String, String, bool>> e1 = (x,y) => x == y; 

然後我想結合Y,同時保留它作爲一個單一表達。 一個明顯的企圖都將是這樣的

Expresion<Func<String, bool>> e2 = x => e1(x, "Fixed Value Here"); 

但是,這會變成我的表情變成一個Invoke節點。有沒有辦法在獲取第二個表達式的簽名時簡單地在我的第一個表達式中綁定一個參數?

回答

16
Expression<Func<String, String, bool>> e1 = (x,y) => x == y; 

var swap = new ExpressionSubstitute(e1.Parameters[1], 
    Expression.Constant("Fixed Value Here")); 
var lambda = Expression.Lambda<Func<string, bool>>(
    swap.Visit(e1.Body), e1.Parameters[0]); 

class ExpressionSubstitute : ExpressionVisitor 
{ 
    public readonly Expression from, to; 
    public ExpressionSubstitute(Expression from, Expression to) 
    { 
     this.from = from; 
     this.to = to; 
    } 
    public override Expression Visit(Expression node) 
    { 
     if (node == from) return to; 
     return base.Visit(node); 
    } 
} 

此使用ExpressionVisitor重建的表達,與恆定代y

另一種方法是使用Expression.Invoke,但這並不適用於所有情況。

+0

正是我想要的。正如你所說,Invoke可能是一個解決方法,但它會像你提供的固定呼叫而不是標籤替換。謝謝。 – Spooles 2011-12-23 15:12:32