【问题标题】:How to detect if a class uses Linq using Roslyn?如何使用 Roslyn 检测一个类是否使用 Linq?
【发布时间】:2015-07-26 19:06:14
【问题描述】:

使用 Roslyn,我想检测一个类是否使用 Linq

假设一些代码如下:

//...
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };       
var lowNums = 
    from n in numbers 
    where n < 5 
    select n; 
//...

还假设此代码不包含该文件 using System.Linq;

我希望能够检测到文件中有一条 linq 语句并(例如)自动添加using System.Linq。我想检测 Linq 的查询或方法语法。

有没有办法可以使用 Roslyn 检测到这一点?我只是想知道代码是否使用了Linq,不想做任何进一步的处理。

【问题讨论】:

  • 我认为您可能想要查找适当的令牌,并在解析文件后检查其中是否有任何(或最小集合)作为令牌存在
  • 我正在使用 stackoverflow.com/a/29336378/4415401 之类的东西,但这似乎没有检测到上面示例中给出的 linq 代码。希望有一些工作(或我可以做的工作)sn-p。

标签: c# linq roslyn


【解决方案1】:

给定语法树,您可以简单地搜索SyntaxKind.QueryExpression 或相关节点类型的节点。

如需更多信息,请在 VS2015 中打开该文件并查看语法可视化工具以查看语法树的确切外观。

【讨论】:

  • 但是这个检测不到numbers.Where(n =&gt; n &lt; 5)版本吧?
  • @JakubLinhart:正确。如果你想检测它,你需要定义你真正想要的(任何名为Where 的方法?特定的 LINQ 提供程序?任何带有 lambda 的扩展方法?)。而且,您可能需要一个语义模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多