2016-04-08 5 views
1

目的を達成するための簡単な方法があるかどうかわかりません。 私は式をプログラムで構築し、反対側には手動で入力した式があります。それらが全く同じであると仮定すると、私はParameterExpressionに変更する必要があります。ここ は、私は、デバッガビュー画像ラムダ式を別のパラメータの別のものに変換/複製する

enter image description here

が、これはなんとかです、あなただと思いますまた、貼り付けるサンプルコード

//I have this expression (for example) 
Expression<Func<Bar,bool>> old_expr = x => x.Name == x.ColBar; 
//I want to change parameter from x to y 
//I already have the y parameter in the code, let's say it is the following 
ParameterExpression py = Expression.Parameter(typeof(Bar), "y"); 
//this is what I have tried, but it is *not* complete neither generic 
Expression expr_to_do; 
if (old_expr.Body.NodeType.Equals(ExpressionType.Convert)) { 
    UnaryExpression convEx = old_expr.Body as UnaryExpression; 
    expr_to_do = convEx.Operand; 
} else { 
    expr_to_do = old_expr.Body; 
} 
//TODO: convert the BinarayExpression eqEx, etc... etc... 
var newLambda = Expression.Lambda(expr_to_do, new ParameterExpression[1]{py}); 

//Again, what I want to get is the following, where y *is* the parameter defined *above* 
Expression<Func<Bar,bool>> new_expr = y => y.Name == y.ColBar; 
//The code/method I'm looking for - if it does exist a method to do that - must be generic enough not specific to this single expression 

のですか? 私はこれを起草し始めたが、

//TODO convert the BinarayExpression eqEx, etc... etc... 

if (expr_to_do.NodeType.Equals(ExpressionType.Equal)) { 
    // have I to manage each Expr Type case?? 
    var eqExpr = expr_to_do as BinaryExpression; 
    var left = eqExpr.Left as MemberExpression; 
    ... 
    var new_left = Expression.Property(...,py) 
} 

は、私は、プロセスを簡素化するために何かをしないのです決して終わることのない努力のように見えますか?

答えて

1

私は右のあなたを取得する場合、あなたは答えとまったく同じことを行う必要があり、ここでuse Expression<Func<T,X>> in Linq contains extension

編集

その場合には、二つの異なる表現と交換があったパラメータからの発現にしました。ここには、開始式が1つだけあり、置換はパラメータからパラメータになります。 次のコードは正常に動作するようです。

var map = old_expr.Parameters.ToDictionary(p => p, p => py); 
var reboundBody = ParameterRebinder.ReplaceParameters(map, old_expr.Body); 
var lambda = Expression.Lambda<Func<Bar,bool>>(reboundBody, py); 

と訪問者

public class ParameterRebinder : ExpressionVisitor 
{ 
    private readonly Dictionary<ParameterExpression, ParameterExpression> Map; 

    public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map) 
    { 
     this.Map = map ?? new Dictionary<ParameterExpression, ParameterExpression>(); 
    } 

    public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp) 
    { 
     return new ParameterRebinder(map).Visit(exp); 
    } 

    protected override Expression VisitParameter(ParameterExpression node) 
    { 
     ParameterExpression replacement; 
     if (this.Map.TryGetValue(node, out replacement)) 
     { 
      return replacement; 
      //return this.Visit(replacement); 
     } 
     return base.VisitParameter(node); 
    } 
} 
+0

私は、私の場合は異なる状況を説明するためにあなたの答えを編集していると私は、変更されたコードを含めました。 –

+0

実際にパラメータをパラメータに置き換えているかどうかはわからないので、特定のソリューションを表示できませんでした。リンクがうれしく思いました。 –

関連する問題