2015-04-06 95 views
5

我有一個包含一些類文件的c#解決方案。藉助Roslyn,我能夠解析解決方案以獲得解決方案中的項目列表。從那裏,我可以在每個項目中獲得文件。然後,我可以得到每個ClassDeclarationSyntax的列表。 這是出發點。Roslyn:如何使用Roslyn C獲得DeclarationSyntax的命名空間#

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

從這些對象我希望能夠讓每個類中使用的變量的命名空間。見文件1有一個方法「getBar()」,它返回一個B.Bar類型的對象。命名空間很重要,因爲它告訴你真正返回哪種類型的Bar。

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(){ 
    } 
} 

的問題是,我不知道^ h從我現在在代碼中的位置獲取名稱空間值。有任何想法嗎?

+0

你應該是'await'ing這些電話。 – SLaks

+0

請注意嵌套類型。 – SLaks

回答

5

的命名空間是語義信息,所以你需要從語義模型得到它:

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

不知道你剛剛提到什麼,因爲在TypeInfo和ContainingNamespace之間似乎有一個缺失的步驟(也許我缺少一個擴展?),但我目前使用此代碼來獲取當前類的名稱空間。 問題是,這隻適用於派生SemanticModel的文檔中定義的對象/類。當你想獲得當前Document實例中沒有定義的對象的命名空間時,它會變得有點棘手。 – Pangamma

+0

掛上@Slaks。我有一個關於如何解決這個問題的理論。這有點哈克,但它應該工作。如果Type的命名空間中包含命名空間,則假定命名空間100%準確。如果類型字符串中沒有句點,則假定它需要與命名空間匹配。遍歷文檔頂部的每個「using」聲明並嘗試使用「+ typeNameString>加載每個<」。如果任何這些選項可以加載,你可以假設你找到了一個匹配。如果它有效,我會稍微發佈代碼。 – Pangamma

+0

@泰勒:哎呀;那應該是'.Type'。 – SLaks

相關問題