简体   繁体   中英

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM