使用 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 调用。