使用 ExpressionVisitor 停止遍历
Stop traversal with ExpressionVisitor
我正在使用 ExpressionVisitor
解析表达式树以查明它是否包含指定参数。一旦找到参数,继续遍历就没有意义了。
有没有什么方法可以停止遍历 访问者模式,更具体地说是 .NET 中的 ExpressionVisitor
?
这是我目前所拥有的,并且按预期工作。但是一旦布尔标志设置为真,就该算法而言,停止遍历是有意义的。
public class ExpressionContainsParameterVisitor : ExpressionVisitor
{
private bool expressionContainsParameter_;
private ParameterExpression parameter_;
public bool Parse(Expression expression, ParameterExpression parameterExpression)
{
parameter_ = parameterExpression;
expressionContainsParameter_ = false;
Visit(expression);
return expressionContainsParameter_;
}
protected override Expression VisitParameter(ParameterExpression node)
{
if (node == parameter_)
{
expressionContainsParameter_ = true;
}
return node;
}
}
我认为你能做的最好的事情就是覆盖 Visit
方法,以便在设置标志后停止调度。
大致如下:
public override Expression Visit(Expression node)
{
if(expressionContainsParameter_) return node;
return base.Visit(node);
}
这应该允许尽可能快地遍历到 "unwind",即使您当前嵌套了几个 Visit
调用。
我正在使用 ExpressionVisitor
解析表达式树以查明它是否包含指定参数。一旦找到参数,继续遍历就没有意义了。
有没有什么方法可以停止遍历 访问者模式,更具体地说是 .NET 中的 ExpressionVisitor
?
这是我目前所拥有的,并且按预期工作。但是一旦布尔标志设置为真,就该算法而言,停止遍历是有意义的。
public class ExpressionContainsParameterVisitor : ExpressionVisitor
{
private bool expressionContainsParameter_;
private ParameterExpression parameter_;
public bool Parse(Expression expression, ParameterExpression parameterExpression)
{
parameter_ = parameterExpression;
expressionContainsParameter_ = false;
Visit(expression);
return expressionContainsParameter_;
}
protected override Expression VisitParameter(ParameterExpression node)
{
if (node == parameter_)
{
expressionContainsParameter_ = true;
}
return node;
}
}
我认为你能做的最好的事情就是覆盖 Visit
方法,以便在设置标志后停止调度。
大致如下:
public override Expression Visit(Expression node)
{
if(expressionContainsParameter_) return node;
return base.Visit(node);
}
这应该允许尽可能快地遍历到 "unwind",即使您当前嵌套了几个 Visit
调用。