2015-04-06 28 views
5

Bazı sınıf dosyalarını içeren bir C# çözümüm var. Roslyn ile çözüm içinde bir proje listesi elde etmek için bir çözüm ayrıştırmak mümkün. Oradan, her projede belgeleri alabilirim. Sonra, her ClassDeclarationSyntax'ın bir listesini alabilirim. Bu başlangıç ​​noktasıdır. Ben her sınıf içinde kullanılan değişkenlerin Namespace elde edebilmek istiyorum bu nesneler itibarenRoslyn: Roslyn C ile bir DeclarationSyntax'ın Adını Nasıl Alabilirim?

 foreach (var v in _solution.Projects) 
     { 
      //Console.WriteLine(v.Name.ToString()); 
      foreach (var document in v.Documents) 
      { 
       SemanticModel model = document.GetSemanticModelAsync().Result; 
       var classes = document.GetSyntaxRootAsync().Result.DescendantNodes().OfType<ClassDeclarationSyntax>(); 
       foreach(var cl in classes) 
       { 
// Starting around this point... 
        ClassDiagramClass cls = new ClassDiagramClass(cl, model); 
        diagramClasses.Add(cls); 
       } 
      } 
     } 

. Bkz. Dosya 1, B.Bar türünde bir nesne döndüren bir "getBar()" yöntemine sahiptir. Ad alanı önemlidir, çünkü size hangi Bar türünün gerçekten döndüğünü bildirir.

File1.cs

using B; 
namespace A { 
    public class foo(){ 
     public Bar getBar(){ return new Bar();} 
    } 
} 

File2.cs

namespace B { 
    public class Bar(){ 
    } 
} 

File3.cs

namespace C { 
    public class Bar(){ 
    } 
} 
sorunu Emin h değilim ki

Namespace değerine şu an kodda olduğum yerden ulaşmak için. Herhangi bir fikir?

+0

Sen bu aramaları await'ing 'olmalıdır. – SLaks

+0

Yuvalı türlere dikkat edin. – SLaks

cevap

5

ad semantik bilgi, yani semantik modelden almak gerekir:

model.GetTypeInfo(cl).Type.ContainingNamespace 
+0

TipInfo ve ContainingNamespace arasında bir eksik adım var gibi göründüğünüzden emin değilsiniz (Belki de bir uzantı eksik miyim?), Ama şu anda bu sınıfın geçerli alanını almak için bu kodu kullanıyorum. Sorun, yalnızca SemanticModel'in türetildiği belgede tanımlanan nesne/sınıflar için çalıştığıdır. Geçerli Belge örneğinde tanımlanmayan bir nesnenin ad alanını almak istediğinizde biraz daha zorlaşır. – Pangamma

+0

Dayan, @Slaks. Bunu nasıl çözeceğime dair bir teorim var. Bu biraz hacky, ama işe yaramalı. Tür, adlandırma dizesinde bulunan ad alanlarına sahipse, ad alanının% 100 doğru olduğunu varsayalım. Eğer yazı dizgisinde periyodlar yoksa, bir ad alanına eşleşmesi gerektiğini varsayalım. Belgenin en üstündeki "kullanma" bildirimlerinin her birini yineleyin ve her <"öğesini" + typeNameString> kullanarak yüklemeye çalışın. Bu seçeneklerden herhangi biri yüklenebilirse, bir eşleşme bulduğunuzu varsayabilirsiniz. Çalışırsa kodu biraz gönderirim. – Pangamma

+0

@Taylor: Oops; Bu .Type olmalıdır. – SLaks

İlgili konular