Остановить обход с ExpressionVisitor
Я использую 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;
}
}
1 ответ
Я думаю, что лучшее, что вы могли бы сделать, это переопределить Visit
метод, чтобы он прекратил отправку после установки флага.
Что-то вроде:
public override Expression Visit(Expression node)
{
if(expressionContainsParameter_) return node;
return base.Visit(node);
}
Это должно позволить обходу "раскручиваться" как можно быстрее, даже если вы в данный момент вложили несколько Visit
звонит глубоко в то время.