Bueno, pasé una noche entera y finalmente descubrí un método estático sobre cómo llenar datos de DataReader en una colección genérica de entidades de datos a través de la reflexión.
//Kchen.Core.BaseBusinessObject es una clase de entidad de datos general, aquí solo limita el tipo heredado por T
IList público estático<T> FillDataListGeneric<T>(lector System.Data.IDataReader) donde T: Kchen.Core.BaseBusinessObject
{
//Crea una instancia de una colección genérica List<>
IList<T> Lista de datos = nueva Lista<T>();
mientras (lector.Read())
{
//Dado que es un tipo desconocido, el objeto de entidad de datos debe crearse dinámicamente según el tipo de T mediante el método Activator.CreateInstance<T>().
T RowInstance = Activator.CreateInstance<T>();
//Obtienes todas las propiedades del objeto mediante la reflexión.
foreach (Propiedad PropertyInfo en typeof(T).GetProperties())
{
//BindingFieldAttribute es un atributo personalizado que se utiliza para vincular los campos de la base de datos
foreach (BindingFieldAttribute FieldAttr en Property.GetCustomAttributes (tipo de (BindingFieldAttribute), verdadero))
{
intentar
{
//Obtener el orden de los campos de la base de datos actual
int Ordinal = lector.GetOrdinal(FieldAttr.FieldName);
si (lector.GetValue(Ordinal)!= DBNull.Value)
{
//Completa los datos leídos por DataReader en las propiedades de la entidad del objeto
Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), nulo);
}
}
atrapar
{
romper;
}
}
}
//Añadir el objeto de entidad de datos a la colección genérica
Lista de datos.Add(RowInstance);
}
devolver Lista de datos;
}
Utilice el siguiente código al llamar
//Pseudocódigo OleDbDataReader _ds = Crear un OleDbDataReader
IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds);
este método estático completa rápidamente datos en la colección genérica de entidades de datos a través de un tipo de entidad y DateReader