2012-01-23 3 views
3

У меня есть список списков, каждый из которых содержит другой класс объекта. Чтобы добавить элементы в правильный список, мне нужно найти тип списка. В настоящее время я пытаюсь выполнить это следующим образом:Получить тип списка <T> с объекта

 foreach(object o in DataBase) 
     { 
      Type t = o.GetType(); 
      if (t != typeof(T)) 
       continue; 
      else 
      { 
       List<T> L = (List<T>)o; 
       L.Add(element); 
       break; 
      } 
     } 

Однако это возвращает тип списка, из System.Collections.Generic.List`1 [[MyType, и т.д., и т.д.]]. Есть ли способ извлечь 'myType' из типа List для правильного сравнения?

+3

Это выглядит действительно ужасным решение проблемы. –

+0

Возможно, я только начал изучать рефлексию. Однако я открыт для предложений. – 3Pi

ответ

6

Применение GetGenericArguments метод:

Type listTypeParam = myListType.GetGenericArguments()[0]; 

Поскольку myListType является экземпляром универсального типа с ровно одним параметром типа, тип T будет возвращен в 0-й позиции возвращенного массива.

+0

Спасибо, именно то, что я искал. Какая другая информация может содержаться в GetGenericArguments()? – 3Pi

+1

'GetGenericArguments' возвращает массив параметров, передаваемых родовому типу. Количество элементов в массиве равно числу параметров типа: для 'List ' всегда 1; для словаря 'всегда 2 и так далее. – dasblinkenlight

3

без явных проверок общего типа аргументов, вы можете быть в состоянии реорганизовать выше код, как:

foreach(object o in DataBase) 
    if (o is List<T>) 
    { 
     (o as List<T>).Add(element) 
     break; 
    } 
+0

Это работает очень аккуратно! – 3Pi

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