代码之家  ›  专栏  ›  技术社区  ›  Jedidja

如何从Roslyn中的using指令获得完全限定的命名空间?

  •  3
  • Jedidja  · 技术社区  · 10 年前

    当你悬停在一个“简化的” using 在VS2015中,它将向您显示完全限定的名称。如何通过Roslyn插件获取此信息?它会使用 DiagnosticAnalyzer ? A. CodeFixProvider ?

    正在读取source.roslyn.codeplex。com上有很多信息,包括如何 add a using statement ,以及如何简化类型名称(包括 使用 语句),但我不知道如何反向获得完全限定的名称。

    1 回复  |  直到 10 年前
        1
  •  6
  •   Jeroen Vannevel luciomrx    10 年前

    使用语义模型,您可以检索有关组成代码的语义的信息(显然)——这允许您获取有关类型和其他构造的特定信息。

    例如:

    void Main()
    {
        var tree = CSharpSyntaxTree.ParseText(@"
    using X = System.Text;
    using Y = System;
    using System.IO;
    
    namespace ConsoleApplication1
    {
    }"
    );
    
        var mscorlib = PortableExecutableReference.CreateFromFile(typeof(object).Assembly.Location);
        var compilation = CSharpCompilation.Create("MyCompilation", syntaxTrees: new[] { tree }, references: new[] { mscorlib });
        var semanticModel = compilation.GetSemanticModel(tree);
        var root = tree.GetRoot();
    
        // Get usings
        foreach (var usingDirective in root.DescendantNodes().OfType<UsingDirectiveSyntax>())
        {
            var symbol = semanticModel.GetSymbolInfo(usingDirective.Name).Symbol;
            var name = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
            name.Dump();
        }
    }
    

    输出:

    全局::System.Text
    全局::系统
    全局::System.IO

    如果您使用 SymbolDisplayFormat.CSharpErrorMessageFormat 相反,您将收到

    系统文本
    系统
    系统IO

    您可以选择您感兴趣的内容,但正如您所看到的,无论使用别名还是不使用别名,它都能正常工作。