Остановить обход с ExpressionVisitor

Я использую ExpressionVisitor проанализировать дерево выражений, чтобы выяснить, содержит ли оно указанный параметр. Как только я нашел параметр, нет смысла продолжать обход.

Есть ли способ остановить обход с помощью шаблона посетителя в целом и, более конкретно, с помощью ExpressionVisitor в.NET?

Это то, что я имею до сих пор, и это работает, как ожидалось. Но как только для логического флага установлено значение true, имеет смысл прекратить обход этого алгоритма.

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;
  }
}

1 ответ

Решение

Я думаю, что лучшее, что вы могли бы сделать, это переопределить Visit метод, чтобы он прекратил отправку после установки флага.

Что-то вроде:

public override Expression Visit(Expression node)
{
  if(expressionContainsParameter_) return node;
  return base.Visit(node);
}

Это должно позволить обходу "раскручиваться" как можно быстрее, даже если вы в данный момент вложили несколько Visit звонит глубоко в то время.

Другие вопросы по тегам