5

を使用してExpressionVisitor式ツリーを解析し、指定されたパラメーターが含まれているかどうかを調べています。パラメータを見つけたら、トラバーサルを続けても意味がありません。

一般的に訪問者パターンで、より具体的には .NETでトラバーサルを停止する方法はありますか?ExpressionVisitor

これは私がこれまでに持っているものであり、期待どおりに機能しています。しかし、boolean フラグが 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 に答える