さて、私は一晩かけて、リフレクションを通じて DataReader からデータ エンティティの汎用コレクションにデータを入力する方法に関する静的メソッドを最終的に考え出しました。
//Kchen.Core.BaseBusinessObject は一般的なデータ エンティティ クラスであり、ここでは T によって継承される型のみを制限します
public static IList<T> FillDataListGeneric<T>(System.Data.IDataReader リーダー) ここで、 T : Kchen.Core.BaseBusinessObject
{
//List<> ジェネリック コレクションをインスタンス化します。
IList<T> DataList = 新しい List<T>();
while (reader.Read())
{
//未知の型であるため、データ エンティティ オブジェクトは、Activator.CreateInstance<T>() メソッドを通じて T の型に基づいて動的に作成される必要があります。
T RowInstance = Activator.CreateInstance<T>();
// リフレクションを通じてオブジェクトのすべてのプロパティを取得します
foreach (typeof(T).GetProperties() の PropertyInfo プロパティ)
{
//BindingFieldAttribute はデータベース フィールドにバインドするために使用されるカスタム属性です
foreach (Property.GetCustomAttributes の BindingFieldAttribute FieldAttr(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);
}
DataList を返します。
}
//疑似コード OleDbDataReader _ds = OleDbDataReader を作成する
場合は、次のコードを使用します。
IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds);
この静的メソッドは、エンティティ タイプと
を通じてデータ エンティティのジェネリック コレクションにデータを迅速に入力します。