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はありますか?調べてみましたが、少なくとも明らかなものは見つかりませんでした。

最新のRoslynSept/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 に答える