Nun, ich habe eine ganze Nacht damit verbracht und schließlich eine statische Methode gefunden, wie man Daten aus DataReader durch Reflektion in eine generische Sammlung von Datenentitäten füllen kann.
//Kchen.Core.BaseBusinessObject ist eine allgemeine Datenentitätsklasse, die hier nur den von T geerbten Typ einschränkt
öffentliche statische IList<T> FillDataListGeneric<T>(System.Data.IDataReader-Leser) wobei T: Kchen.Core.BaseBusinessObject
{
//Instanziieren Sie eine generische List<>-Sammlung
IList<T> DataList = new List<T>();
while (reader.Read())
{
//Da es sich um einen unbekannten Typ handelt, muss das Datenentitätsobjekt basierend auf dem T-Typ über die Methode Activator.CreateInstance<T>() dynamisch erstellt werden.
T RowInstance = Activator.CreateInstance<T>();
//Erhalte alle Eigenschaften des Objekts durch Reflexion
foreach (PropertyInfo-Eigenschaft in typeof(T).GetProperties())
{
//BindingFieldAttribute ist ein benutzerdefiniertes Attribut, das zum Binden an Datenbankfelder verwendet wird
foreach (BindingFieldAttribute FieldAttr in Property.GetCustomAttributes(typeof(BindingFieldAttribute), true))
{
versuchen
{
//Die Reihenfolge der aktuellen Datenbankfelder abrufen
int Ordinal = reader.GetOrdinal(FieldAttr.FieldName);
if (reader.GetValue(Ordinal) != DBNull.Value)
{
//Füllen Sie die von DataReader gelesenen Daten in die Eigenschaften der Objektentität ein
Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
}
}
fangen
{
brechen;
}
}
}
//Fügen Sie das Datenentitätsobjekt zur generischen Sammlung hinzu
DataList.Add(RowInstance);
}
return DataList;
}
Verwenden Sie den folgenden Code beim Aufruf von
//Pseudocode OleDbDataReader _ds = Erstellen Sie einen OleDbDataReader
IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds);
Diese statische Methode füllt schnell Daten in die generische Datenentitätssammlung über einen Entitätstyp und