글쎄, 저는 밤새도록 시간을 보냈고 마침내 리플렉션을 통해 DataReader의 데이터를 일반 데이터 엔터티 컬렉션에 채우는 방법에 대한 정적 메서드를 알아냈습니다.
//Kchen.Core.BaseBusinessObject는 일반 데이터 엔터티 클래스입니다. 여기서는 T에서 상속된 유형만 제한합니다.
public static IList<T> FillDataListGeneric<T>(System.Data.IDataReader reader) 여기서 T : Kchen.Core.BaseBusinessObject
{
//List<> 일반 컬렉션 인스턴스화
IList<T> DataList = 새로운 List<T>();
동안(reader.Read())
{
//알 수 없는 타입이므로 Activator.CreateInstance<T>() 메소드를 통해 T의 타입을 기준으로 데이터 엔터티 객체를 동적으로 생성해야 합니다.
T RowInstance = Activator.CreateInstance<T>();
//리플렉션을 통해 객체의 모든 속성을 가져옵니다.
foreach(typeof(T).GetProperties()의 PropertyInfo 속성)
{
//BindingFieldAttribute는 데이터베이스 필드에 바인딩하는 데 사용되는 사용자 정의 속성입니다.
foreach(Property.GetCustomAttributes(typeof(BindingFieldAttribute), true)의 BindingFieldAttribute FieldAttr))
{
노력하다
{
//현재 데이터베이스 필드의 순서를 가져옵니다.
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를 반환합니다.
}
호출 시 다음 코드를 사용하세요.
_ds = OleDbDataReader 생성
IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds);
정적 메서드는 엔터티 유형 및 DateReader를 통해 데이터 엔터티 일반 컬렉션에 데이터를 빠르게 채웁니다.