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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With