Roslyn-CTPで少し実験しています。
var
現在、コンクリートタイプに交換しようとしています。
var i=1;
次のようになります。
int i=1;
推論されたタイプを理解するのは簡単です。しかし、この部分はセマンティックモデルで発生するため、。を取得しITypeSymbol
ます。置換は構文モデルで行われるため、が必要TypeSyntax
です。肥大化した名前()は必要ないのでglobal::System.Int32
、変換はコンテキストに依存します(using
、ネストされたタイプなど)。
Roslynの一部であるVisualStudioバージョンには、「タイプ名の簡略化」クイックフィックスにこの機能がすでに含まれていますが、サンプルを調べると、この変換を行う簡単な方法が見つかりませんでした。
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ビルドの制限であると思われます。