Я немного экспериментирую с Roslyn-CTP.
В настоящее время я пытаюсь заменить var
на конкретный тип.
var i=1;
должно стать:
int i=1;
Выяснить тип вывода легко.Но так как эта часть происходит в семантической модели, я получаю ITypeSymbol
.Замена происходит в синтаксической модели, поэтому мне нужен TypeSyntax
.Поскольку я не хочу раздутого имени (global::System.Int32
), преобразование зависит от контекста (using
, вложенные типы и т. Д.).
Версия 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 # и не зависят от языка интерфейса.
I 'Вы загрузили рабочую версию на github: https://github.com/CodesInChaos/Roslyn
Она не работает для var
в foreach
, но я подозреваю, что это ограничение текущей сборки Roslyn.