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

Jed*_*dja 3 c# roslyn

当您将鼠标悬停using在 VS2015 中的“简化”指令上时,它会显示完全限定名称。我如何通过 Roslyn 插件获取这些信息?它会使用DiagnosticAnalyzer? 一个CodeFixProvider

阅读 source.roslyn.codeplex.com,那里有大量信息,包括如何添加using语句,以及如何简化类型名称(包括using语句),但我无法弄清楚如何反向获取完全限定的名称。

Jer*_*vel 6

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

例如:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

global::System.Text
global::System
global::System.IO

如果您SymbolDisplayFormat.CSharpErrorMessageFormat改为使用,您将收到

System.Text
系统
System.IO

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

  • 我建议您通读 Josh Varty 对这些概念的出色演练——它们将阐明究竟是什么。https://joshvarty.wordpress.com/learn-roslyn-now/ (2认同)