【发布时间】:2016-04-08 23:29:57
【问题描述】:
我不知道是否有一种简单的方法可以实现我的目标。 一方面,我以编程方式建立了一个表达式,另一方面,我手动输入了相同的表达式。假设它们完全相同,我需要将手册中的 ParameterExpression 更改为等于另一个。 这是一个示例代码
//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)
}
我是否遗漏了什么来简化流程?
【问题讨论】: