首页 > 解决方案 > 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));

问题出在哪里,我该如何解决?

标签: c#roslynanalyzer

解决方案


我不知道为什么调试模式对您的工作方式不同。但是,我认为您可能错误地使用了 DescendantNodes 方法。

传递给 DescendantNodes 的函数是一个谓词,它确定沿着语法树查找后代的算法是否继续到给定节点的子节点。如果此函数返回 false,则不会返回该语法树路径下的其他子级。

这与使用 LINQ Where 方法非常不同,后者将集合过滤为仅与谓词匹配的节点。

例如,第一个可能会在方法体中找到所有嵌套的纯块,但找不到属于其他类型语句的任何块,因为这些语句永远不会被考虑,因为其他类型的语句本身不是块。但是,使用第二种形式(Where 方法),该函数会考虑根下的所有节点,从而找到所有块。


推荐阅读