【发布时间】:2011-11-22 17:41:24
【问题描述】:
我正在尝试使用 Roslyn-CTP。
目前我正在尝试用具体类型替换var。
var i=1;
应该变成:
int i=1;
找出推断的类型很容易。但由于这部分发生在语义模型中,我得到了ITypeSymbol。替换发生在语法模型中,所以我需要一个TypeSyntax。由于我不想要一个臃肿的名称 (global::System.Int32),因此转换取决于上下文(using、嵌套类型等)。
作为 Roslyn 一部分的 Visual Studio 版本已经在其“简化类型名称”快速修复中提供了此功能,但查看示例我找不到进行此转换的简单方法。
根据我现在使用的 Kevin Pilch-Bisson 的回答:
var location = document.GetSyntaxTree().GetLocation(node);
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel());
可以从CommonSyntaxTree 获得ToMinimalDisplayString 的位置。
另一个复杂之处是ToMinimalDisplayString 需要类Location 和SemanticModel,而document.GetSemanticModel() 和CommonSyntaxTree.GetLocation 只返回一个接口。
我通过简单地转换为类来解决问题,这似乎目前可行。
嗯,看起来这些类是 C# 特定的,并且接口语言独立。
我已经在 github 上上传了一个工作版本:https://github.com/CodesInChaos/Roslyn
它不适用于 foreach 中的 var,但我怀疑这是当前 Roslyn 构建的限制。
【问题讨论】:
-
回复:您的最后一句话:正确;在 CTP 构建完成之前,我们没有在
foreach中完全实现var,抱歉。