Получение универсального типа из типа объявления вложенного типа в C # с отражением

#c# #.net #reflection

#c# #.net #отражение

Вопрос:

Допустим, у меня есть следующая структура класса:

 public class Outer<T>
{
    public class Inner<U>
    {
    }
}
  

И некоторый код:

 var testType = typeof(Outer<string>.Inner<int>);
  

Как я могу получить сконструированный универсальный тип typeof(Outer<string>) или значение универсального typeof(string) из testType переменной?

Ответ №1:

Интересно — кажется, что универсальный аргумент внешнего типа проецируется на внутренний тип:

 var testType = typeof(Outer<string>.Inner<int>);              
var outerType = testType.DeclaringType;                       
var outerTypeGenericParam = outerType.GetGenericArguments();
var testTypeGenericParam = testType.GetGenericArguments();
Console.WriteLine(outerType);                                 // Test Outer`1[T] 
Console.WriteLine(outerTypeGenericParam[0]);                  // T
Console.WriteLine(testTypeGenericParam[0]);                   // System.String
Console.WriteLine(testTypeGenericParam[1]);                   // System.Int32
  

таким образом, однострочный вариант в вашем случае будет:

 testType.GetGenericArguments()[0]
  

Комментарии:

1. Вы имеете в виду testType.GetGenericArguments()[0] ? testType.DeclaringType.GetGenericArguments()[0] дает мне typeof(T) . В любом случае, хороший улов 🙂

2. @Shane. Хороший улов. Исправлено.