2013-07-01 2 views
4

Для большинства объектов я могу сделать,Поиск Тип IEnumerable объекта

obj.getType().FullName 

Но для следующего кода,

static void Main(string[] args) 
     { 
      IEnumerable<int> em = get_enumerable(); 
      Console.WriteLine(em.GetType()); 
      Console.Read(); 
     } 

     static IEnumerable<int> get_enumerable() 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       yield return i; 
      } 
     } 

Выход,

ConsoleApplication1.Program + d__0

Где ConsoleApplication1 является сборкой, а программа содержит класс (не показан). Почему он не показывает IEnumerable и как я могу сделать GetType более описательным для этого случая?

+0

Возможный дубликат [Какой конкретный тип возвращает доходность?] (Http://stackoverflow.com/questions/3454395/what-concrete-type-does-yield-return-return) – James

+0

@James: Это не дубликат; он спрашивает, как проверить тип итератора. – SLaks

ответ

7

IEnumerable<T> - открытый общий тип. Это не настоящий тип; это просто функция, которая создает бетонные (закрытые) общие типы, такие как IEnumerable<int>.

IEnumerable<int> - это интерфейс; невозможно иметь экземпляр интерфейса.

Ваша функция итератора фактически возвращает экземпляр скрытого генерируемого компилятором класса, который реализует IEnumerable<int>; это то, что вы видите от GetType().

Вы хотите найти общий параметр типа в IEnumerable<T> реализации типа по:

em.GetType().GetInterface("System.Collections.Generic.IEnumerable`1") 
      .GetGenericArguments()[0] 
2

IEnumerable является интерфейс, но GetType возвратит System.Type, представляющий класс объекта, а не интерфейс (ы) он реализует.

При использовании yield return, компилятор С # автоматически создает новый класс (названный ConsoleApplication1.Program+d__0 в данном случае), который реализует IEnumerable<int>IEnumerable).

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