Что ж, я провел целую ночь и наконец нашел статический метод, как заполнить данные из DataReader в общую коллекцию объектов данных посредством отражения.
//Kchen.Core.BaseBusinessObject — это общий класс объектов данных, здесь он ограничивает только тип, унаследованный T
public static IList<T> FillDataListGeneric<T>(читатель System.Data.IDataReader), где T: Kchen.Core.BaseBusinessObject
{
//Создаем экземпляр общей коллекции List<>
IList<T> DataList = новый список<T>();
пока (читатель.Читать())
{
//Поскольку это неизвестный тип, объект объекта данных должен быть создан динамически на основе типа T с помощью метода Activator.CreateInstance<T>().
T RowInstance = Activator.CreateInstance<T>();
//Получаем все свойства объекта посредством отражения
foreach (свойство PropertyInfo в typeof(T).GetProperties())
{
//BindingFieldAttribute — это пользовательский атрибут, используемый для привязки к полям базы данных.
foreach (BindingFieldAttribute FieldAttr в Property.GetCustomAttributes(typeof(BindingFieldAttribute), true))
{
пытаться
{
//Получаем порядок текущих полей базы данных
int Ordinal = reader.GetOrdinal(FieldAttr.FieldName);
if (reader.GetValue(Ordinal) != DBNull.Value)
{
//Заполняем данные, считанные DataReader, в свойства сущности объекта
Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
}
}
ловить
{
перерыв;
}
}
}
//Добавляем объект объекта данных в общую коллекцию
DataList.Add(RowInstance);
}
вернуть список данных;
}
Используйте следующий код при вызове
//Псевдокод OleDbDataReader _ds = Создайте OleDbDataReader
IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds)
Этот статический метод быстро заполняет данные в общую коллекцию объектов данных с помощью типа объекта и DateReader