【发布时间】:2018-03-28 08:56:19
【问题描述】:
我有我的自定义访客,它可以左右查看并将参数更改为常量。
我知道仅仅改变节点是不可能的。
我应该返回包含常量而不是参数的新 lambda 表达式。
但我自己无法创建表达式:(
我有这个代码:
public class ParametersTransformToConstantVisitor : ExpressionVisitor
{
private Dictionary<string, ConstantExpression> parameters = new Dictionary<string, ConstantExpression>();
public ParametersTransformToConstantVisitor(Dictionary<string, ConstantExpression> parameters)
{
this.parameters = parameters;
}
protected override Expression VisitBinary(BinaryExpression node)
{
var constExprLeftName = new Lazy<string>(() => ((ParameterExpression) node.Left)?.Name);
var constExprRightName = new Lazy<string>(() => ((ParameterExpression) node.Right)?.Name);
var constExprName = new Lazy<string>(() => ((ParameterExpression) node.Reduce())?.Name);
ParameterExpression leftParam = null;
ParameterExpression rightParam = null;
if (node.NodeType == ExpressionType.Parameter && parameters.ContainsKey(constExprName.Value))
{
return parameters[constExprName.Value];
}
if (node.Left.NodeType == ExpressionType.Parameter && parameters.ContainsKey(constExprLeftName.Value))
{
leftParam = (ParameterExpression) node.Left;
}
if (node.Right.NodeType == ExpressionType.Parameter && parameters.ContainsKey(constExprLeftName.Value))
{
rightParam = (ParameterExpression) node.Right;
}
if (leftParam != null || rightParam != null)
{
//return Expression.Lambda();
}
return base.VisitBinary(node);
}
}
请帮我构建 lambda 表达式
【问题讨论】:
-
我可以检查一下吗?您在这里通过 name 更改参数,对吗?那么名称为
Foo的参数将成为具有该键的字典中的常量? -
是的,如果参数名称包含在字典中,我会更改此参数
标签: c# lambda expression