【问题标题】:Get TypeSyntax from ITypeSymbol从 ITypeSymbol 获取 TypeSyntax
【发布时间】: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 需要类LocationSemanticModel,而document.GetSemanticModel()CommonSyntaxTree.GetLocation 只返回一个接口。
我通过简单地转换为类来解决问题,这似乎目前可行。

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


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

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

【问题讨论】:

  • 回复:您的最后一句话:正确;在 CTP 构建完成之前,我们没有在 foreach 中完全实现 var,抱歉。

标签: c# roslyn


【解决方案1】:

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

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

【讨论】:

  • 顺便说一句,在回答关于您的产品的问题时,您不需要免责声明。如果您要推荐您的产品,则应使用免责声明。
  • 那么他将如何为那一行添加前缀,无害促销(答案,而不是产品)?
  • @sq33G:除非他试图证明他知道自己在说什么,否则他根本不需要那句话。如果是的话,他可以把它放在括号里。
  • 小补充:获取TypeSyntax可以使用SyntaxFactory.ParseTypeName(minimalDisplayString)
【解决方案2】:

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

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

这就是你如何获得可空参数的类型

[这里的标识符名称说明这是自定义对象。可以是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.

【讨论】:

  • IPropertySymbol x = (IPropertySymbol)semanticModel.GetDeclaredSymbol(prop); -- 对不起,我错过了上面
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多