тип системы. Коллекция ‹T›

Я создаю список из <T>, но я хочу знать тип этого Т-объекта. (Я использую отражение в своем проекте, поэтому я не знаю тип, когда создаю свой код.

Итак, сначала у меня есть мои List -> List<T> значения

Теперь я хочу получить все свойства этого T-объекта (для создания столбцов в сетке данных)

любая помощь?


person Jordy    schedule 20.09.2009    source источник


Ответы (5)


Вы можете просто использовать typeof (T) в своем классе или универсальном методе:

void ProcessList<T>(List<T> list) {
    Type typeOfT = typeof(T);
    // Work with type...
}
person Reed Copsey    schedule 20.09.2009
comment
Если OP использует отражение (вопрос), то нет хорошего способа вызвать этот метод, не зная заранее T; по крайней мере, до C # 4.0 (вы можете использовать его как динамический метод и позволить среде выполнения беспокоиться об этом). - person Marc Gravell; 21.09.2009

Для функции GetListType см. этот ответ. Чтобы получить свойства списка для привязки данных, вы действительно должны использовать компонентную модель (для совместимости), т.е.

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(type);

Затем посмотрите на каждый PropertyDescriptor, используя GetValue / Converter и т. Д. Код вашего списка, как правило, должен работать с неуниверсальным IList; что-то типа:

IList list = ...
object obj = list[rowIndex];
// then for any given "prop"
object val = prop.GetValue(obj);
string displayText = prop.Converter.ConvertToString(val);

Однако, если вы хотите быть «законченным», вам также нужно взглянуть на IListSource и ITypedList

person Marc Gravell    schedule 20.09.2009

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

person Joey    schedule 20.09.2009
comment
Что, если не вся коллекция однотипна? - person Ahmed Khalaf; 20.09.2009
comment
@Ahmed - тогда это не толковый список; на самом деле, рассмотрение первого элемента в списке - это официальный резервный подход, используемый, когда IList также не является ITypedList и не имеет не объектного индексатора. Так что это неплохое предложение. Но если T можно идентифицировать из самого списка, это предпочтительнее. - person Marc Gravell; 20.09.2009
comment
В вопросе четко указано, что это список ‹T›, нет причин, по которым элементы в списке могут быть разных типов. - person Abhijeet Patel; 21.09.2009
comment
Что ж, T может быть супертипом всех элементов в списке, поэтому вы получаете автомобиль для элемента 1, велосипед для элемента 2 и т. Д. - person Joey; 21.09.2009

Это так же просто, как GetType (), а затем использовать отражение для GetProperties ()?

person Jarrett Meyer    schedule 20.09.2009

 values.GetType().GetGenericArguments()[0].FullName 

Вышеуказанное дает вам объект типа для типа 'T'

values.GetType().GetGenericArguments()[0].GetProperties(System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance) 

Вышеупомянутое дает вам общедоступные свойства, доступные на 'T', вы можете передать соответствующие BindingFlags по своему усмотрению.

person Abhijeet Patel    schedule 20.09.2009