12

我正在尝试使用 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());

可以ToMinimalDisplayStringCommonSyntaxTree.

另一个复杂之处是ToMinimalDisplayString需要类Locationand SemanticModel,而document.GetSemanticModel()andCommonSyntaxTree.GetLocation只返回一个接口。
我通过简单地投射到类来解决问题,这似乎目前有效。

嗯,看起来这些类是 C# 特定的,并且接口语言独立。


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

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

4

2 回答 2

15

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

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

于 2011-11-22T18:21:41.957 回答
-1

问题:找到可为空的参数类型。它可以是自定义对象或系统标识符。

在 c# - customobject 有 kind() == 标识符和 bool/string/ 有预定义类型。

这就是您将参数类型设置为 nullable 的方式

[这里的标识符名称说明这是自定义对象。可以是 PredefinedType]

 Class A
 {
     public bool ? test;
    public b ? obj1;
 }
 // Get the semantic model and get the property declarationsyntax

 PropertyDeclarationSyntax prop = (get it somehow)[]

 INamedTypeSymbol tp = (INamedTypeSymbol)x.Type;

 string nameoftype = tp.TypeArguments.FirstOrDefault().Name;

 ITypeSymbol s1 = tp.TypeArguments.FirstOrDefault();

 TypeSyntax t1 = SyntaxFactory.ParseTypeName(s1.ToMinimalDisplayString(semanticModel, 
 prop.SpanStart));

 t1.kind == IdentifierName meaning its custom object type.
于 2021-05-03T23:21:13.320 回答