Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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;
  }
}
like image 576
Oskar Avatar asked Apr 20 '16 08:04

Oskar


1 Answers

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.

like image 79
Damien_The_Unbeliever Avatar answered Sep 25 '22 14:09

Damien_The_Unbeliever