前兩篇介紹了反射的基礎操作與測試驗證,本文將進入實戰場景:利用反射實現 DataTable 到實體物件集合的自動映射,這是 ORM(物件關係映射)框架的核心雛形。
using System;
using System.Collections;
using System.Data;
using ObjectLoader;
namespace DataTableAOP
{
public class ObjectList
{
///
/// 將 DataTable 轉換為強型別 ArrayList
///
/// 資料來源
/// 目標實體類別名稱(含命名空間)
/// 實體物件集合
public static ArrayList GetObjectList(DataTable dataTable, string name)
{
ShowObject show = new ShowObject();
DataRowCollection rows = dataTable.Rows;
ArrayList list = new ArrayList();
foreach (DataRow row in rows)
{
// 透過反射建立實例
object obj = show.LoadObject(name);
// 逐欄位映射屬性值
foreach (DataColumn column in dataTable.Columns)
{
show.SetPropertyValue(obj, column.ColumnName, row[column.ColumnName]);
}
list.Add(obj);
}
return list;
}
}
}
LoadObject內部呼叫 Assembly.CreateInstance("命名空間.類別名"),在運行時根據字串建立物件,打破編譯期靜態綁定限制。
SetPropertyValue流程如下:
TypeType.GetProperty(propertyName) 取得 PropertyInfoPropertyInfo.SetValue(obj, value, null) 完成賦值此機制實現「慣例優於配置」:資料庫欄位名與實體屬性名一致即可自動映射。
PropertyInfo 為 null(屬性不存在),略過不拋出異常本範例展示核心映射邏輯,若進一步擴展可實現:
[Column("db_field")] 標記屬性,支援欄位名不同步ArrayList 升級為 List<T>,提供型別安全System.Reflection.Emit)提升效能反射雖帶來效能開銷,但在資料存取層這類「開發效率優於執行效率」的場景,其價值極高。掌握此模式,即掌握了自建 ORM 框架的鑰匙。