Как получить тип во время выполнения универсального класса, используя Roslyn? - PullRequest
0 голосов
/ 13 февраля 2019

Например, у меня есть следующий тип:

public class MyClass<T>
{
    public T Prop { get; }
}

Или, скажем, у меня есть следующий метод:

private static void Method<T>() 
{
     //how I can get a real type of <T>
}

Как я могу получить тип во время выполнения универсального классаиспользуя roslyn?Я имею в виду реальный тип <T>

static void Main(string[] args)
{
    // here I need to get int
    var m = new MyClass<int>();

    // here I need to get object
    var m1 = new MyClass<object>();
}

1 Ответ

0 голосов
/ 13 февраля 2019

Если у вас есть синтаксическое дерево 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>() в вашем примере, это просто, как я ответил.

...