【问题标题】:Stop traversal with ExpressionVisitor使用 ExpressionVisitor 停止遍历
【发布时间】:2016-04-20 08:02:15
【问题描述】:

我正在使用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;
  }
}

【问题讨论】:

    标签: c# .net expression-trees visitor-pattern expressionvisitor


    【解决方案1】:

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

    类似的东西:

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

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

    【讨论】:

    • 谢谢,有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多