Oskar
Oskar

Reputation: 8175

Stop traversal with ExpressionVisitor

I am using the ExpressionVisitor to parse an expression tree to find out if it contains a specified parameter. Once I have found the parameter, there is no point in continuing the traversal.

Is there any way to stop the traversal with the visitor pattern in general and more specifically with the ExpressionVisitor in .NET?

This is what I have so far, and it is working as expected. But once the boolean flag is set to true it would make sense to stop the traversal as far as this algorithm goes.

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

Upvotes: 7

Views: 592

Answers (1)

Damien_The_Unbeliever
Damien_The_Unbeliever

Reputation: 239784

I think that the best you could do would be to override the Visit method so that it stops dispatching once the flag is set.

Something along the lines of:

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

This should allow the traversal to "unwind" as quickly as possible, even if you're currently nested several Visit calls deep at the time.

Upvotes: 10

Related Questions