Bem, passei uma noite inteira e finalmente descobri um método estático sobre como preencher dados do DataReader em uma coleção genérica de entidades de dados por meio de reflexão.
//Kchen.Core.BaseBusinessObject é uma classe de entidade de dados geral, aqui apenas limita o tipo herdado por T
public static IList<T> FillDataListGeneric<T>(System.Data.IDataReader leitor) onde T : Kchen.Core.BaseBusinessObject
{
//Instancia uma coleção genérica List<>
IList<T>DataList = new List<T>();
enquanto (leitor.Read())
{
//Por ser um tipo desconhecido, o objeto entidade de dados deve ser criado dinamicamente com base no tipo de T através do método Activator.CreateInstance<T>().
T RowInstance = Activator.CreateInstance<T>();
//Obtém todas as propriedades do objeto através da reflexão
foreach (propriedade PropertyInfo em typeof(T).GetProperties())
{
//BindingFieldAttribute é um atributo personalizado usado para vincular aos campos do banco de dados
foreach (BindingFieldAttribute FieldAttr em Property.GetCustomAttributes(typeof(BindingFieldAttribute), true))
{
tentar
{
//Obtém a ordem dos campos atuais do banco de dados
int Ordinal = leitor.GetOrdinal(FieldAttr.FieldName);
if (leitor.GetValue(Ordinal) != DBNull.Value)
{
//Preenche os dados lidos pelo DataReader nas propriedades da entidade objeto
Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
}
}
pegar
{
quebrar;
}
}
}
//Adiciona o objeto de entidade de dados à coleção genérica
DataList.Add(RowInstance);
}
retornar ListaDados;
}
Use o código a seguir ao chamar
//Pseudocódigo OleDbDataReader _ds = Crie um OleDbDataReader
IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds);
Este método estático preenche rapidamente os dados na coleção genérica da entidade de dados por meio de um tipo de entidade e
.