【问题标题】:Roslyn : How to get the Namespace of a DeclarationSyntax with Roslyn C#Roslyn:如何使用 Roslyn C# 获取 DeclarationSyntax 的命名空间
【发布时间】:2015-06-11 07:38:48
【问题描述】:

我有一个包含一些类文件的 c# 解决方案。使用 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);
                }
            }
        }

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

文件1.cs

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

文件2.cs

namespace B {
    public class Bar(){
    }
}

文件3.cs

namespace C {
    public class Bar(){
    }
}

问题是我不确定如何从我现在在代码中的位置获取命名空间值。有任何想法吗?

【问题讨论】:

  • 你应该await这些电话。
  • 小心嵌套类型。

标签: c# analysis roslyn


【解决方案1】:

命名空间是语义信息,所以需要从语义模型中获取:

model.GetTypeInfo(cl).Type.ContainingNamespace

【讨论】:

  • 不确定您刚刚提到的内容,因为 TypeInfo 和 ContainingNamespace 之间似乎缺少一个步骤(也许我缺少扩展名?),但我目前正在使用此代码来获取当前班级。问题是这仅适用于在派生 SemanticModel 的文档中定义的对象/类。当您想要获取当前 Document 实例中未定义的对象的命名空间时,它会变得有点棘手。
  • 等一下,@Slaks。我有一个关于如何解决这个问题的理论。这有点hacky,但它应该可以工作。如果 Type 在其命名字符串中包含命名空间,则假设命名空间是 100% 准确的。如果类型字符串中没有句点,则假定它需要与命名空间匹配。遍历文档顶部的每个“using”声明并尝试加载每个 。如果可以加载这些选项中的任何一个,则可以假设您已找到匹配项。如果可以,我会稍后发布代码。
  • @Taylor:哎呀;那应该是.Type
  • @Taylor:SemanticModel 应该包含文档中每个符号的完整类型信息。如果您的符号来自其他地方,那么还有其他 API。你不需要任何黑客。
  • @Taylor:您正在寻找Compilation.GetTypeByMetadataNamesource.roslyn.io/#Microsoft.CodeAnalysis/Compilation/…
猜你喜欢
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多