2012-12-07 8 views
5

Muszę wyświetlić listę wszystkich metod rozszerzenia znalezionych w pliku.Jak uzyskać metody rozszerzenia na Roslyn?

To, co robię do tej pory (wygląda jak to działa):

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

Nawet nie mogłem przetestować wszystkich przypadków wygląda to tak działa. Ale zastanawiałem się, czy istnieje bardziej zwięzły sposób podejścia do tego rozwiązania.

Czy jest jakiś rodzaj IsExtension lub niektóre SyntaxKind.ExtensionMethod? Przyjrzałam się, ale nie mogłam znaleźć niczego oczywistego.

używam najnowszego Roslyn Sept/12

Odpowiedz

4

Pracujesz na poziomie syntaktycznym i na tym poziomie, nie ma czegoś takiego jak „metodę rozszerzenia”. Możesz uzyskać informacje semantyczne (zwane Symbol) dla każdej metody, a tam zobaczysz, czy jest to metoda rozszerzenia. Coś jak:

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

Oznacza to faktycznie potrzebuje kod do kompilowania i będzie trzeba także dodać wszelkie niezbędne odniesienia do kompilacji.

+0

Dziękuję za odpowiedź, zadziałało. Zastanawiałem się tylko, czy mogę zastosować moje podejście, aby uniknąć konieczności dodawania referencji. Chciałem pozostawić projekt tak niezależny, jak to tylko możliwe. Dzięki. – eestein

+0

Tak, jeśli nie chcesz dodawać referencji, myślę, że twoje podejście jest rozsądne. – svick

+0

OK, dzięki! – eestein

Powiązane problemy