Я немного экспериментирую с Roslyn-CTP.
В настоящее время я пытаюсь заменить var
на конкретный тип.
var i=1;
должен стать:
int i=1;
Выяснение выведенного типа легко. Но так как эта часть происходит в семантической модели, я получаю a ITypeSymbol
. Замена происходит в синтаксической модели, поэтому мне нужен TypeSyntax
. Поскольку я не хочу раздутого имени (global::System.Int32
), преобразование зависит от контекста (using
, вложенные типы и т.д.).
Версия Visual Studio, в которой часть Roslyn уже имеет эту функциональность в своем быстром имени "Simplify type name", но просматривая образцы, я не мог найти простой способ сделать это преобразование.
Основываясь на ответе Кевина Пильча-Биссона, я теперь использую:
var location = document.GetSyntaxTree().GetLocation(node);
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel());
Место, которое ToMinimalDisplayString
можно получить из a CommonSyntaxTree
.
Дополнительным осложнением является то, что ToMinimalDisplayString
требует классов Location
и SemanticModel
, тогда как document.GetSemanticModel()
и CommonSyntaxTree.GetLocation
возвращает только интерфейс.
Я работал, просто бросая на классы, которые, похоже, работают на данный момент.
Хм, похоже, что классы имеют специфический С#, а язык интерфейса не зависит.
Я загрузил рабочую версию github: https://github.com/CodesInChaos/Roslyn
Это не работает для var
в foreach
, но я подозреваю, что ограничение текущей сборки Roslyn.