Есть ли способ получить тип объектов, хранящихся в общем списке? - PullRequest
4 голосов
/ 20 января 2011

Учитывая общий список типа List<T> как мне найти тип T?

Полагаю, если список заполнится, я мог бы взять listInstance[0].GetType(), но это выглядит немного хакерски.

Edit:

Для контекста я хочу заполнить таблицу DataTable столбцами, основанными на свойствах объекта. Если свойство объекта является общим списком, я хочу добавить столбец для каждого свойства объекта, сохраненного в списке. Я сглаживаю структуру данных, чтобы она вписывалась в DataRow позже.

Причина, по которой я не хочу использовать тип первого объекта в списке, заключается в том, что не гарантируется, что у каждого экземпляра будет заполненный список. Некоторые будут, а некоторые нет, но мне все равно понадобятся все колонки раньше времени.

Ответы [ 7 ]

7 голосов
/ 20 января 2011

Вы можете попробовать

typeof(List<T>).GetGenericArguments()[0]

Это работает с пустым массивом, а ваша версия - нет.

UPDATE:

В случае использования

instance.GetType().GetGenericArguments()[0]
1 голос
/ 20 января 2011

Вы можете использовать

 myList.GetType().GetGenericArguments()

Возвращает массив всех типов, указанных в объявлении объекта.

1 голос
/ 20 января 2011

Это хакерство, потому что если список не заполнен, вы не сможете получить ответ.

Вам нужно будет отразить против Типа:

List<int> mylist = new List<int>();
Type listType = mylist.GetType();
Type genericType = listType.GetGenericArguments()[0];
1 голос
/ 20 января 2011

Почему это хакерство ?, вовсе не хакерство.Вот почему метод GetType() завершается.Для получения типа объекта.

0 голосов
/ 20 января 2011

У вас должен быть доступ к параметру type, чтобы вы могли использовать typeof:

void ProcessList<T>( List<T> listInstance)
{
    Type type = typeof(T);
}
0 голосов
/ 20 января 2011

Вы также можете сделать listInstance[0] is SomeTypeIExpectThisToBe, если вы ожидаете тип и хотите что-то сделать из-за этого

0 голосов
/ 20 января 2011

Сделай, как ты сказал. Это не хакерство.

Вы также можете вызвать GetType () непосредственно в вашем списке и использовать его для просмотра типа его T.

...