我正在使用 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
需要类 Location
和 SemanticModel
,而 document.GetSemanticModel()
而 CommonSyntaxTree.GetLocation
只返回一个接口(interface)。
我通过简单地转换为类来解决问题,这似乎目前有效。
嗯,看起来这些类是特定于 C# 的,而接口(interface)是独立于语言的。
我已经在 github 上上传了一个工作版本:https://github.com/CodesInChaos/Roslyn
它不适用于 foreach
中的 var
,但我怀疑这是当前 Roslyn 构建的限制。
最佳答案
您可以使用适用于 ISymbol
的 ToMinimalDisplayString()
扩展方法获取最短的合法字符串来表示给定位置的符号(注意:它位于 ` Roslyn.Compilers.CSharp.SymbolDisplay.
免责声明:我在 Microsoft 的 Roslyn 团队工作。
关于c# - 从 ITypeSymbol 获取 TypeSyntax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8231211/