Roslyn:如何使用Roslyn C获取DeclarationSyntax的命名空间#

我有一个包含一些类文件的ac#解决方案。 通过Roslyn,我能够解析解决方案以获得解决方案中的项目列表。 从那里,我可以获得每个项目的文件。 然后,我可以获得每个ClassDeclarationSyntax的列表。 这是起点。

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

问题是我不知道如何从代码中的位置获取Namespace值。 有任何想法吗?

命名空间是语义信息,因此您需要从语义模型中获取它:

 model.GetTypeInfo(cl).Type.ContainingNamespace