停止ExpressionVisitor的遍历

7
我正在使用ExpressionVisitor来解析一个表达式树以查找是否包含指定的参数。一旦找到参数,继续遍历就没有意义了。
在访问者模式中一般有一种方式可以停止遍历,特别地,在.NET中,可以使用ExpressionVisitor实现。
目前我的代码能够正常工作。但是,一旦布尔标志设置为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个回答

10
我认为你最好的选择是重载Visit方法,以便在设置标志后停止调度。大概就像这样:
public override Expression Visit(Expression node)
{
  if(expressionContainsParameter_) return node;
  return base.Visit(node);
}

即使您当前在多个 Visit 调用嵌套层次中,这应该允许遍历尽可能快速地“解开”。


谢谢,我明白了。 - Oskar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接