Вставьте объект в общий список, чтобы получить список элементов

Есть ли способ, которым я могу добавить неизвестный объект в общий список, чтобы получить список элементов из объекта по заданному ProperyName. Объект может быть любым общим списком, например List<Country>, List<Area> или List<Region>, но мне нужно получить данные по заданному displayMember.

Например:

List<City> listCities = new List<City>(); //Cities data with (CityID, CityName)
object dataSource = listCities;
string displayMember = "CityName";
string valueMember = "CityID";

Как получить список CityName из объекта dataSource типа объекта?


person Zeeshanef    schedule 19.06.2014    source источник


Ответы (1)


В основном вам придется использовать отражение. Например:

// This assumes it really is just a List<T>...
IEnumerable list = (IEnumerable) dataSource;
Type elementType = list.GetType().GetGenericArguments()[0];
PropertyInfo property = elementType.GetProperty(displayMember);
List<object> displayValues = list.Cast<object>()
                                 .Select(v => property.GetValue(v, null))
                                 .ToList();

(Вы бы хотели добавить кучу проверок ошибок - например, что property не null...)

person Jon Skeet    schedule 19.06.2014
comment
Строка GetGenericArguments выдает ошибку: невозможно применить индексирование с [] к выражению типа «группа методов» - person Zeeshanef; 19.06.2014
comment
@Zeeshanef: опечатка - исправлена. - person Jon Skeet; 19.06.2014
comment
Спасибо. Может быть, я не мог четко задать свой вопрос. Но объект dataSource относится к типу object, который, я думаю, не содержит определения «Выбрать». В первых двух строках я получил информацию о свойствах от object, что в порядке. но как получить List‹propertyName› из объекта. Может быть, мне нужен «IEnumerable‹T›», но я не знаю, как его использовать. - person Zeeshanef; 19.06.2014
comment
Спасибо за этот ответ! Мой босс и я ломали голову, пытаясь понять, как это сделать! - person Randy P.; 18.11.2014