ฉันใช้เวลาทั้งคืนและในที่สุดก็พบวิธีการคงที่ในการกรอกข้อมูลจาก DataReader ลงในคอลเล็กชันเอนทิตีข้อมูลทั่วไปผ่านการไตร่ตรอง
//Kchen.Core.BaseBusinessObject เป็นคลาสเอนทิตีข้อมูลทั่วไป ในที่นี้จะจำกัดเฉพาะประเภทที่สืบทอดโดย T
IList แบบคงที่สาธารณะ <T> FillDataListGeneric <T> (ตัวอ่าน System.Data.IDataReader) โดยที่ T : Kchen.Core.BaseBusinessObject
-
//สร้างตัวอย่างรายการ<>คอลเลกชันทั่วไป
IList<T> DataList = รายการใหม่<T>();
ในขณะที่ (reader.Read())
-
//เนื่องจากเป็นประเภทที่ไม่รู้จัก วัตถุเอนทิตีข้อมูลจะต้องถูกสร้างขึ้นแบบไดนามิกตามประเภทของ T ผ่านเมธอด Activator.CreateInstance<T>()
T RowInstance = Activator.CreateInstance<T>();
//รับคุณสมบัติทั้งหมดของวัตถุผ่านการสะท้อนกลับ
foreach (คุณสมบัติ PropertyInfo ใน typeof(T).GetProperties())
-
//BindingFieldAttribute เป็นแอตทริบิวต์ที่กำหนดเองซึ่งใช้ในการผูกกับเขตข้อมูลฐานข้อมูล
foreach (BindingFieldAttribute FieldAttr ใน Property.GetCustomAttributes(typeof(BindingFieldAttribute), จริง))
-
พยายาม
-
//รับลำดับของฟิลด์ฐานข้อมูลปัจจุบัน
int Ordinal = reader.GetOrdinal (FieldAttr.FieldName);
ถ้า (reader.GetValue (ลำดับ) != DBNull.Value)
-
//กรอกข้อมูลที่ DataReader อ่านลงในคุณสมบัติของเอนทิตีวัตถุ
Property.SetValue (RowInstance, Convert.ChangeType (reader.GetValue (ลำดับ), Property.PropertyType), null);
-
-
จับ
-
หยุดพัก;
-
-
-
//เพิ่มวัตถุเอนทิตีข้อมูลไปยังคอลเลกชันทั่วไป
DataList.Add(แถวอินสแตนซ์);
-
กลับรายการข้อมูล;
-
ใช้รหัสต่อไปนี้เมื่อเรียก
// Pseudocode OleDbDataReader _ds = สร้าง OleDbDataReader
IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds);
วิธีการคงที่นี้จะเติมข้อมูลลงในคอลเลกชันทั่วไปของเอนทิตีข้อมูลอย่างรวดเร็วผ่านประเภทเอนทิตีและ