حسنًا، لقد أمضيت ليلة كاملة واكتشفت أخيرًا طريقة ثابتة لكيفية ملء البيانات من DataReader إلى مجموعة عامة من كيانات البيانات من خلال الانعكاس.
//Kchen.Core.BaseBusinessObject عبارة عن فئة كيان بيانات عامة، وهنا يقتصر فقط على النوع الموروث بواسطة T
IList ثابت عام<T> fillDataListGeneric<T>(قارئ System.Data.IDataReader) حيث T: Kchen.Core.BaseBusinessObject
{
// إنشاء مثيل لمجموعة List<> العامة
IList<T> DataList = new List<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, true))
{
يحاول
{
// احصل على ترتيب حقول قاعدة البيانات الحالية
int Ordinal = Reader.GetOrdinal(FieldAttr.FieldName);
إذا (reader.GetValue(Ordinal) != DBNull.Value)
{
// املأ البيانات التي قرأها DataReader في خصائص كيان الكائن
Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
}
}
يمسك
{
استراحة؛
}
}
}
// أضف كائن كيان البيانات إلى المجموعة العامة
DataList.Add(RowInstance);
}
إرجاع قائمة البيانات؛
}
استخدم الكود التالي عند الاتصال
//الكود الكاذب OleDbDataReader _ds = إنشاء OleDbDataReader
IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds);
تقوم هذه الطريقة الثابتة بملء البيانات بسرعة في المجموعة العامة لكيان البيانات من خلال نوع الكيان وDateReader.com