加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用ExpressionVisitor停止遍历

发布时间:2020-12-15 23:32:39 所属栏目:百科 来源:网络整理
导读:我正在使用ExpressionVisitor来解析表达式树,以确定它是否包含指定的参数.一旦找到参数,继续遍历是没有意义的. 是否有任何方法可以通过访问者模式停止遍历,更具体地说,使用.NET中的ExpressionVisitor? 这是我到目前为止所做的,它正如预期的那样工作.但是一
我正在使用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;
  }
}

解决方法

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

有点像:

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

这应该允许遍历尽可能快地“展开”,即使您当前嵌套了多个深度访问呼叫.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读