我正在尝试使用 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());
可以ToMinimalDisplayString
从CommonSyntaxTree
.
另一个复杂之处是ToMinimalDisplayString
需要类Location
and SemanticModel
,而document.GetSemanticModel()
andCommonSyntaxTree.GetLocation
只返回一个接口。
我通过简单地投射到类来解决问题,这似乎目前有效。
嗯,看起来这些类是 C# 特定的,并且接口语言独立。
我在 github 上上传了一个工作版本:https ://github.com/CodesInChaos/Roslyn
它不适用于var
a foreach
,但我怀疑这是当前 Roslyn 构建的限制。