2012-12-07 25 views
5

Ich muss alle Erweiterungsmethoden für die Datei auflisten.Wie man Verlängerungsmethoden auf Roslyn erhält?

Das ist, was ich bisher zu tun (sieht aus wie es funktioniert):

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))); 

Auch wenn ich nicht alle Fälle sieht es testen könnte wie folgt funktioniert. Aber ich habe mich gefragt, ob es einen prägnanteren Weg gab, diese Lösung anzugehen.

Gibt es eine Art von IsExtension oder eine SyntaxKind.ExtensionMethod? Ich warf einen Blick darauf, konnte aber nichts Offensichtliches finden.

Ich verwende den neuesten Roslyn September/12

Antwort

4

Sie auf syntaktischer Ebene arbeiten und auf dieser Ebene gibt es nicht so etwas wie „Extension-Methode“. Was Sie tun können, ist semantische Informationen (Symbol) für jede Methode zu erhalten und dort sehen Sie, ob es eine Erweiterungsmethode ist. Etwas wie:

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); 

Dies bedeutet, dass Ihr Code muss tatsächlich kompilieren, und Sie werden auch alle notwendigen Hinweise auf die Zusammenstellung hinzufügen.

+0

Vielen Dank für die Antwort, es hat funktioniert. Ich habe mich nur gefragt, ob ich meinen Ansatz verwenden könnte, um Referenzen zu vermeiden. Ich wollte das Projekt so unabhängig wie möglich gestalten. Vielen Dank. – eestein

+0

Ja, wenn Sie keine Referenzen hinzufügen möchten, dann ist Ihre Herangehensweise vernünftig. – svick

+0

Ok dann, danke! – eestein

Verwandte Themen