Я немного экспериментирую с Roslyn-CTP.
В настоящее время я пытаюсь заменить var
конкретным типом.
var i=1;
должно стать:
int i=1;
Определить предполагаемый тип несложно. Но поскольку эта часть происходит в семантической модели, я получаю ITypeSymbol
. Замена происходит в синтаксической модели, поэтому мне нужен TypeSyntax
. Поскольку мне не нужно раздутое имя ( global :: System.Int32
), преобразование зависит от контекста ( с использованием
, вложенных типов и т. Д.).
Версия Visual Studio, входящая в состав Roslyn, уже имеет эту функциональность в быстром исправлении «Упростить имя типа», но, просмотрев примеры, я не смог найти простой способ выполнить это преобразование.
На основе ответа Кевина Пилч-Биссона я сейчас использую:
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.