我正在尝试使用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());
可以从ToMinimalDisplayString
获取CommonSyntaxTree
的位置。
另一个复杂因素是ToMinimalDisplayString
需要课程Location
和SemanticModel
,而document.GetSemanticModel()
和CommonSyntaxTree.GetLocation
只需要返回一个界面。
我只是通过简单地投射到课程来解决这个问题,这似乎现在很有用。
嗯,看起来这些类是C#特有的,并且接口语言是独立的。
我在github上传了一个正在运行的版本:https://github.com/CodesInChaos/Roslyn
它对var
中的foreach
无效,但我怀疑这是当前Roslyn版本的限制。
答案 0 :(得分:12)
您可以使用适用于ToMinimalDisplayString()
的{{1}}扩展方法获取最短的合法字符串来表示给定位置的符号(注意:它位于`Roslyn.Compilers.CSharp.SymbolDisplay中。
免责声明:我在Roslyn团队的Microsoft工作。
答案 1 :(得分:-1)
问题:找到可为空的参数类型。它可以是自定义对象或系统标识符。
在 c# 中 - customobject 具有 kind() == identifier 并且 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.