c# - Roslyn .. 获取 DescendantNodes
问题描述
我对 roslyn 方法 DescendantNodes() 有疑问.. 使用这一行
var blockNodes = root.DescendantNodes(n => n.IsKind(SyntaxKind.Block))
在这种情况下,当我在调试模式下使用 lambda 表达式时,它可以工作..但是当我构建 DLL 并将其作为分析器连接到项目时,它不起作用..只有当我将其重写为:
var nodes = root.DescendantNodes();
var blockNodes = nodes.Where(n => n.IsKind(SyntaxKind.Block));
问题出在哪里,我该如何解决?
解决方案
我不知道为什么调试模式对您的工作方式不同。但是,我认为您可能错误地使用了 DescendantNodes 方法。
传递给 DescendantNodes 的函数是一个谓词,它确定沿着语法树查找后代的算法是否继续到给定节点的子节点。如果此函数返回 false,则不会返回该语法树路径下的其他子级。
这与使用 LINQ Where 方法非常不同,后者将集合过滤为仅与谓词匹配的节点。
例如,第一个可能会在方法体中找到所有嵌套的纯块,但找不到属于其他类型语句的任何块,因为这些语句永远不会被考虑,因为其他类型的语句本身不是块。但是,使用第二种形式(Where 方法),该函数会考虑根下的所有节点,从而找到所有块。
推荐阅读
- wpf - 动画用户控件
- javascript - React 中的 Konva 无限网格
- ruby-on-rails - 更新 Amazon RDS SSL/TLS 证书 - Elastic Beanstalk
- kubernetes - 在 Kubernetes 中命名服务会阻止它启动
- c# - 在 Net Core 3.0 中同时使用 GRPC 通道
- javascript - 如何验证/阻止缩短字符串中的 URL
- python - Travis 收集...命令“pytest”以 1 退出
- excel - 范围内的 PowerQuery 范围
- linux - Linux 中给定命令的 CPU 利用率
- python - 创建知道每个列表长度的子列表