Ich weiß nicht, ob es einen einfachen Weg gibt, um mein Ziel zu erreichen. Auf der einen Seite habe ich einen Ausdruck programmgesteuert und auf der anderen Seite den gleichen Ausdruck manuell eingegeben. Unter der Annahme, dass sie genau die gleichen sind, muss ich zu ParameterExpression in der manuellen Eins zu ändern, die gleich der anderen ist. Hier ist ein BeispielcodeKonvertieren/Klonen eines Lambda-Ausdrucks in einen anderen mit einem anderen Parameter
//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
I fügen auch einen Debugger Ansicht Bild
Glauben Sie, das ist machbar? Ich begann diese zu entwerfen, aber es scheint eine zu sein, nie endende Anstrengung
//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)
}
Ich bin etwas fehlt, den Prozess zu vereinfachen?
Ich habe bearbeitet die Antwort der unterschiedlichen Situation in meinem Fall zu erklären, und ich habe den geänderten Code enthalten. –
War nicht sicher, ob Sie wirklich einen Parameter durch einen Parameter ersetzen, also konnte Ihnen keine spezifische Lösung zeigen, froh, dass der Link Ihnen half. –