c# - Roslyn:如何获取未解析类型的候选命名空间

标签 c# .net types namespaces roslyn

使用 Roslyn,有没有一种方法可以获得列表中每个未解析符号的候选 namespace 列表?如果是这样,有没有一种方法可以对属于多个可能命名空间的具有歧义的符号进行“最佳匹配”?

我想为文件中未解析的符号生成一个 using 语句列表。我能够使用类似 Roslyn : How to get unresolved types 的方法从语义信息中获取未解析的符号,但找不到从项目中引用的程序集中获取这些符号的命名空间的方法。

最佳答案

我浏览了 Roslyn Repo,当他们认为用户缺少 using 时,他们似乎使用 SymbolFinder 检索信息:参见 here.

至于找到“最佳”匹配,我相信这是您必须根据您认为的“最佳”匹配来实现的事情。 Visual Studio 只是向您显示所有候选 using 语句。

这是我快速拼凑的示例,用于演示 SymbolFinder:

var ws = new AdhocWorkspace();
var solutionInfo = SolutionInfo.Create(SolutionId.CreateNewId();, VersionStamp.Create());
var solution = ws.AddSolution(solutionInfo);
var project = ws.AddProject("Sample", "C#");

//Add reference to mscorlib
var mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
project = project.AddMetadataReference(mscorlib);
ws.TryApplyChanges(project.Solution);

string text = @"
class C
{
    void M()
    {
        //Missing a using System;
        Console.Write();
    }
}";
var sourceText = SourceText.From(text);

//Add document to project
var doc = ws.AddDocument(project.Id, "NewDoc", sourceText);
var model = doc.GetSemanticModelAsync().Result;
var unresolved = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<IdentifierNameSyntax>()
   .Where(x => model.GetSymbolInfo(x).Symbol == null);

foreach (var identifier in unresolved)
{
    var candidateUsings = SymbolFinder.FindDeclarationsAsync(doc.Project, identifier.Identifier.ValueText, ignoreCase: false).Result;

    //Process candidate usings...
}

关于c# - Roslyn:如何获取未解析类型的候选命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29335979/

相关文章:

java - 这个通用 Guice 绑定(bind)方法的 TypeLiteral 等价物有什么问题?

java - 解释整数溢出的两种方法

c# - Graphics.DrawImage OutOFMemory 异常

c# - machine.config 路径

c# - Newtonsoft.Json.Schema.JsonSchema 已过时?

php - 尽管使用 PDO::PARAM_INT 参数,MySQL/PDO::quote() 还是在整数周围加上引号

c# - 使用 HelixToolkit 使 3D 模型面朝半透明的问题

c# - 在 Visual Studio 2010 中自动格式化 lambda 函数

c# - UDP客户端-服务器问题

C# 暂停异步任务适用于一种方法,但不适用于另一种方法