6

我需要列出在文件中找到的所有扩展方法。

这就是我目前正在做的事情(看起来它正在工作):

var methods = nodes.OfType<MethodDeclarationSyntax>();    
var extensionMethods = methods.Where(m => 
        m.Modifiers.Any(t => t.Kind == SyntaxKind.StaticKeyword) 
        && m.ParameterList.Parameters.Any(p => 
            p.Modifiers.Any(pm => pm.Kind == SyntaxKind.ThisKeyword)));

即使我无法测试所有案例,但看起来这很有效。但我想知道是否有更简洁的方法来处理这个解决方案。

是否有某种 IsExtension 或某种 SyntaxKind.ExtensionMethod?我看了看,但至少找不到任何明显的东西。

我正在使用最新的 Roslyn 9 月 12 日

4

1 回答 1

5

你在句法层面工作,在这个层面上,没有“扩展方法”之类的东西。您可以做的是获取Symbol每个方法的语义信息(称为 ),然后您将看到它是否是扩展方法。就像是:

SyntaxTree tree = …
var compilation = Compilation.Create("foo").AddSyntaxTrees(tree);
var model = compilation.GetSemanticModel(tree);

var methods = …
var extensionMethods =
   methods.Where(m => model.GetDeclaredSymbol(m).IsExtensionMethod);

这意味着您的代码实际上需要编译,并且您还必须向编译添加任何必要的引用。

于 2012-12-07T18:34:57.820 回答