繁体   English   中英

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

[英]How can I get the fully qualified namespace from a using directive in Roslyn?

当您将鼠标悬停在VS2015中的“简体” using指令上时,它将显示标准名称。 我如何通过Roslyn插件获取此信息? 会使用DiagnosticAnalyzer吗? CodeFixProvider

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

使用语义模型,您可以(明显地)检索有关组成代码的语义的信息-这使您可以获得有关类型和其他构造的特定信息。

例如:

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 ,您将收到

System.Text
系统
System.IO

您可以选择自己感兴趣的内容,但是如您所见,带别名和不带别名都可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM