5

我正在使用ExpressionVisitor解析表达式树来确定它是否包含指定的参数。找到参数后,继续遍历就没有意义了。

有没有什么办法可以阻止访问者模式的遍历,更具体地说是ExpressionVisitor.NET中的遍历?

这就是我到目前为止所拥有的,并且按预期工作。但是,一旦布尔标志设置为 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;
  }
}
4

1 回答 1

8

我认为您能做的最好的事情就是覆盖该Visit方法,以便在设置标志后停止调度。

类似于以下内容:

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

这应该允许遍历尽快“展开”,即使您当前嵌套了多个Visit调用。

于 2016-04-20T08:25:52.263 回答