2016-12-12 2 views
1

Начиная с объекта TypeInfo, который представляет общий тип, я хочу получить TypeInfo s для каждого параметра типа общего типа. Я хотел бы, чтобы выставить это как метод расширения с этой подписью:Roslyn - Get TypeInfo параметра типа в другом TypeInfo

public static TypeInfo[] GetTypeParameterInfos(this TypeInfo genericType) { 
    //Do stuff 
} 

Если я прохожу в TypeInfo, представляющий List<int>, он должен возвращать массив, содержащий 1 TypeInfo представляющий int. Если я переведу TypeInfo, представляющий Dictionary<int, string>, он должен вернуть массив с int и stringTypeInfo.

Возможно ли это? Как?


Update/Решение:

Чтобы уточнить, я спрашивал о Microsoft.CodeAnalysis.TypeInfo, а не System.Reflection.TypeInfo. Эта путаница названий была реальной проблемой для получения значимых результатов Google. Тем не менее, похоже, что я действительно хочу Microsoft.CodeAnalysis.ITypeSymbol, который можно легко приобрести у Roslyn TypeInfo с собственностью TypeInfo.Type.

Решение находится в свойстве INamedTypeSymbol.TypeArguments, которое возвращает ImmutableArray<ITypeSymbol>, соответствующее аргументам типа данного символа типа.

TypeInfo myGenericType = GetTypeInfoSomehow(); 
ImmutableArray<ITypeSymbol> typeArguments = myGenericType.Type.TypeArguments; 
+0

Вы имеете в виду Roslyn 'ITypeSymbol' или Reflection' TypeInfo'? Они не имеют ничего общего с друг друга. – SLaks

+0

Я имею в виду Roslyn 'Microsoft.CodeAnalysis.TypeInfo', а не' System.Reflection.TypeInfo'. У Roslyn также есть интерфейс 'ITypeSymbol', который можно получить из' Microsoft.CodeAnalysis.TypeInfo', поэтому я могу использовать решение, основанное на 'ITypeSymbol'. – JamesFaix

+0

Я продолжаю работать в результатах поиска 'System.Reflection.TypeInfo'. – JamesFaix

ответ

3

Как вы можете видеть из source, Рослин-х TypeInfo очень тонкая обертка вокруг ITypeSymbol; вот где вам нужно искать, чтобы получить что-нибудь полезное в этом типе.

Если тип на самом деле является общим типом (в отличие от специальных типов, таких как массивы или указатели), на самом деле это будет INamedTypeSymbol, в котором есть все API, необходимые для исследования типа.

В вашем случае вы просто хотите его TypeArguments property.

Смежные вопросы