2011-12-22 9 views
10

表現。 明白な試みがバインドパラメータ

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

ようなものになるだろう。しかしそれは、Invokeノードに私の表現を回すでしょう。 2番目の式の署名を取得しながら、最初の式の中のパラメータを単純にバインドする方法はありますか?

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

これは一定でyを代入し、式を再構築するExpressionVisitorを使用すると

答えて

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

もう1つの方法はExpression.Invokeを使用することですが、これはすべての場合に機能しません。

+0

まさに私が望むもの。あなたが言ったように、Invokeは回避策でしたが、提供したラベル置換の代わりに固定呼び出しのようになっていました。ありがとう。 – Spooles

関連する問題