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
{
//Instanziieren Sie eine generische List<>-Sammlung
IList
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 RowInstance = Activator.CreateInstance
//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
Diese statische Methode füllt schnell Daten in die generische Datenentitätssammlung über einen Entitätstyp und