2011-11-22 42 views
10

我正在嘗試一下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需要的類和LocationSemanticModel,而document.GetSemanticModel()CommonSyntaxTree.GetLocation僅返回一個接口。
我通過簡單地鑄造到類似的工作,現在似乎工作。

嗯它看起來像類是C#特定的,並且接口語言是獨立的。


我上傳一個工作版本在GitHub上:https://github.com/CodesInChaos/Roslyn

它不適合varforeach工作,但我懷疑這是當前羅斯林構建的限制。

+2

回覆:您最後的聲明:正確;在CTP構建完成之前,我們沒有在'foreach'中完全實現'var'',對不起 –

回答

12

你可以在最短的法律字符串中使用適用於ISymbol(注意ToMinimalDisplayString()擴展方法在給定的位置來表示一個符號:它在`Roslyn.Compilers.CSharp.SymbolDisplay發現

免責聲明:我在Roslyn團隊工作在微軟

+10

順便說一句,您不需要免責聲明當你回答你的產品問題時,如果你推薦你的產品,應該使用免責聲明 – SLaks

+0

那他怎麼會在線,無害促銷(答案,而不是產品)? – sq33G

+3

@ sq33G:除非他試圖證明他知道他在說什麼,他根本不需要那條線。如果他是,他可以把它放在括號內。 – SLaks