2012-12-07 8 views
5

ファイルにあるすべての拡張メソッドをリストする必要があります。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のようなものがありますか?私は見ましたが、少なくとも、明らかなものは何も見つかりませんでした。

私はあなたが構文レベルでこのレベルで作業している最新のロスリン9月/ 12

答えて

4

を使用しています、「拡張メソッド」のようなものはありません。あなたができることは、各メソッドに対して意味情報(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); 

これはあなたのコードが実際にコンパイルする必要があり、あなたはまた、コンパイルに必要なすべての参照を追加する必要がありますを意味します。

+0

答えをありがとう、それは働いた。参照を追加することを避けるために自分のアプローチを使用できるかどうかは疑問でした。私はプロジェクトを可能な限り独立させたいと思っていました。ありがとう。 – eestein

+0

ええ、参照を追加したくない場合は、あなたのアプローチは合理的なものだと思います。 – svick

+0

それでは、ありがとう! – eestein

関連する問題