#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. Спасибо за этот ответ! Мы с боссом ломали голову, пытаясь понять, как это сделать!