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

Pan*_*mma 7 c# analysis roslyn

我有一个包含一些类文件的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<ClassDeclarationSyntax>();
                foreach(var cl in classes)
                {
// Starting around this point...
                    ClassDiagramClass cls = new ClassDiagramClass(cl, model);
                    diagramClasses.Add(cls);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

从这些对象我希望能够获得每个类中使用的变量的命名空间.参见文件1有一个方法"getBar()",它返回一个B.Bar类型的对象.命名空间很重要,因为它告诉您实际返回的是哪种类型的Bar.

File1.cs

using B;
namespace A {
    public class foo(){
        public Bar getBar(){ return new Bar();}
    }
}
Run Code Online (Sandbox Code Playgroud)

File2.cs

namespace B {
    public class Bar(){
    }
}
Run Code Online (Sandbox Code Playgroud)

File3.cs

namespace C {
    public class Bar(){
    }
}
Run Code Online (Sandbox Code Playgroud)

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

SLa*_*aks 9

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

model.GetTypeInfo(cl).Type.ContainingNamespace
Run Code Online (Sandbox Code Playgroud)