c# - 从 ITypeSymbol 获取 TypeSyntax

标签 c# roslyn

我正在使用 Roslyn-CTP 进行一些试验。

目前我正在尝试将 var 替换为具体类型。

var i=1;

应该变成:

int i=1;

找出推断的类型很容易。但是由于这部分发生在语义模型中,我得到了一个 ITypeSymbol。替换发生在语法模型中,因此我需要一个 TypeSyntax。由于我不想要一个臃肿的名称 (global::System.Int32),转换是上下文相关的(using、嵌套类型等)。

作为 Roslyn 的一部分的 Visual Studio 版本已经在其“简化类型名称”quickfix 中具有此功能,但查看示例我找不到进行此转换的简单方法。


基于我现在使用的 Kevin Pilch-Bisson 的回答:

var location = document.GetSyntaxTree().GetLocation(node);
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel());

可以从 CommonSyntaxTree 中获取 ToMinimalDisplayString 的位置。

另一个复杂的问题是 ToMinimalDisplayString 需要类 LocationSemanticModel,而 document.GetSemanticModel()CommonSyntaxTree.GetLocation 只返回一个接口(interface)。
我通过简单地转换为类来解决问题,这似乎目前有效。

嗯,看起来这些类是特定于 C# 的,而接口(interface)是独立于语言的。


我已经在 github 上上传了一个工作版本:https://github.com/CodesInChaos/Roslyn

它不适用于 foreach 中的 var,但我怀疑这是当前 Roslyn 构建的限制。

最佳答案

您可以使用适用于 ISymbolToMinimalDisplayString() 扩展方法获取最短的合法字符串来表示给定位置的符号(注意:它位于 ` Roslyn.Compilers.CSharp.SymbolDisplay.

免责声明:我在 Microsoft 的 Roslyn 团队工作。

关于c# - 从 ITypeSymbol 获取 TypeSyntax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8231211/

相关文章:

c# - PropertyGrid UITypeEditor 禁用单元格编辑

c# - 在 .Net 中编译 C# 程序后的 MSIL 文件在哪里?

c# - 是否可以在 switch 语句中使用 nameof 表达式?

c# - 如何在 visual studio 2015 中使用 roslyn c# 编译器?

c# - 构建一个 web 项目破坏了解决方案中第二个的编译版本

c# - lambda 相当于 collection.Count(predicate)

c# - 从数据库 Azure DocumentDB 接收所有文档

c# - VS2015 : Will they use the Roslyn compiler? 中的 VS2013 C# 项目

c# - 支持编译依赖的多个版本 (vNext)

c# - MVC 5 Application_Start 未运行