2012-12-07 27 views
5

Dosyada bulunan tüm uzantı yöntemlerini listelemem gerekiyor.Roslyn'de uzatma yöntemleri nasıl edinilir?

Bu defa ne yapıyorum olduğunu (işe yarıyor gibi görünüyor):

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

Bu çalışıyor gibi görünüyor tüm durumlarda test edemedi bile. Ama bu çözüme yaklaşmanın daha özlü bir yolu olup olmadığını merak ediyordum.

Bir çeşit IsExtension veya bazı SyntaxKind.ExtensionMethod var mı? En azından bir baktım ama belli bir şey bulamadım.

Ben son Roslyn Sept/12

cevap

4

Sen sözdizimsel düzeyinde çalışıyorsanız ve bu düzeyde, “uzatma yöntemi” diye bir şey yoktur kullanıyorum. Yapabilecekleriniz, her bir yöntem için anlamsal bilgileri (Symbol olarak adlandırılır) almaktır ve burada bir uzantı yöntemi olup olmadığını göreceksiniz. Bir şey gibi:

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

Bu kod aslında derlemek gerekiyor ve ayrıca derleme için gerekli başvuruları eklemek zorunda olacağı anlamına gelir.

+0

Cevabınız için teşekkürler, işe yaradı. Sadece referans eklemek zorunda kalmamak için yaklaşımımı kullanıp kullanamayacağımı merak ediyordum. Projeyi mümkün olduğunca bağımsız bırakmak istedim. Teşekkürler. – eestein

+0

Evet, referans eklemek istemiyorsanız, yaklaşımınızın makul olduğunu düşünüyorum. – svick

+0

Tamam o zaman, teşekkürler! – eestein