2011-12-22 9 views
10

Vorrei sapere come associare i parametri ai valori all'interno di un albero di espressioneparametro obbligatorio in tutti gli alberi di espressione

Qualcosa di simile

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

Poi vorrei legare y, pur mantenendo come singolo espressione. Un tentativo evidente sarebbe qualcosa di simile

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

Ma che avrebbe trasformato la mia espressione in un nodo Invoke. C'è un modo per associare semplicemente un parametro alla mia prima espressione mentre ottengo la firma della seconda espressione?

risposta

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]); 

con

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); 
    } 
} 

questo utilizza ExpressionVisitor per ricostruire l'espressione, sostituendo y con la costante.

Un altro approccio è utilizzare Expression.Invoke, ma questo non funziona in tutti i casi.

+0

Esattamente quello che volevo. Come hai detto, l'Invoke avrebbe potuto essere un problema, ma sarebbe stato come una chiamata fissa invece di una sostituzione di etichetta come hai fornito. Grazie. – Spooles

Problemi correlati