Приведение объекта в общий список для получения списка элементов

#c# #casting #generic-list

#c# #Кастинг #общий список

Вопрос:

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

Например:

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

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

Ответ №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 …)

Комментарии:

1. Строка GetGenericArguments выдает ошибку: «Невозможно применить индексацию с помощью [] к выражению типа «группа методов»»

2. @Zeeshanef: опечатка исправлена.

3. Спасибо. Может быть, я не смог четко задать свой вопрос. Но dataSource object — это object тип, который, я думаю, не содержит определения ‘Select’. В первых двух строках я получил информацию о свойствах, с object которой все в порядке. но как получить список <propertyName> из ‘object’. Может быть, мне нужен ‘IEnumerable<T>’, но я не знаю, как использовать.

4. Спасибо за этот ответ! Мы с боссом ломали голову, пытаясь понять, как это сделать!