我正在嘗試一下Roslyn-CTP。從ITypeSymbol獲取TypeSyntax
目前我試圖用var
替換爲具體類型。
var i=1;
應該變成:
int i=1;
搞清楚推斷出的類型很容易。但是由於這部分發生在語義模型中,我得到了ITypeSymbol
。替換髮生在語法模型中,所以我需要一個TypeSyntax
。由於我不想要一個臃腫的名字(global::System.Int32
),轉換是依賴於上下文的(using
,嵌套類型等)。
作爲Roslyn一部分的Visual Studio版本已在其「簡化類型名稱」quickfix中具有此功能,但查看示例時我無法找到執行此轉換的簡單方法。
基於凱文·皮爾希,比森的回答,現在我使用的是:
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
工作,但我懷疑這是當前羅斯林構建的限制。
回覆:您最後的聲明:正確;在CTP構建完成之前,我們沒有在'foreach'中完全實現'var'',對不起 –