如何在Roslyn上获得扩展方法?

时间:2012-12-07 17:02:07

标签: c# roslyn

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

这就是我到目前为止所做的事情(看起来它正在发挥作用):

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 Sept / 12

1 个答案:

答案 0 :(得分: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);

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