Если у вас есть синтаксическое дерево MyClass
и вы хотите получить конкретный тип или конкретизированный тип ITypeParameterSymbol T
, простой ответ: вы не можете сделать это с Roslyn.
Если выЯ имею в виду, как получить тип из экземпляра, как это new MyClass<int>()
, ответ:
var genericType = // the ObjectCreationExpressionSyntax from type GenericNameSyntax
var typArg = genericType.TypeArgumentList.Arguments.First();
var type = model.GetSymbolInfo(typeArg).Symbol // this is your concrete type
Вы также можете анализировать IdentifierName
или TypeSyntax
в TypeArgument
, но это синтаксически, а не семантически.
Обновление
Пожалуйста, объясните, с какой точки зрения вы хотите получить информацию о типе времени выполнения.
Как я уже писал,если вы держите синтаксическое дерево MyClass<T>
(в вашем примере), вы не сможете получить никакой информации.Roslyn может сказать вам, что это универсальный тип, но это так.Единственный способ получить эту информацию - во время выполнения (например, если вы находитесь в режиме отладки и вы устанавливаете точку останова где-то в этом классе и проверяете тип T в окне просмотра).
Если вы хотите получить тип из инстанцированного синтаксиса, такого как var m = new MyClass<int>()
в вашем примере, это просто, как я ответил.