首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 反射應用實戰(三):資料庫操作層的自動映射實作

     編輯:關於C語言

前言

前兩篇介紹了反射的基礎操作與測試驗證,本文將進入實戰場景:利用反射實現 DataTable 到實體物件集合的自動映射,這是 ORM(物件關係映射)框架的核心雛形。

核心代碼:ObjectList 工具類

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;
        }
    }
}

關鍵技術點解析

1. 動態實例化:LoadObject

內部呼叫 Assembly.CreateInstance("命名空間.類別名"),在運行時根據字串建立物件,打破編譯期靜態綁定限制。

2. 屬性值注入:SetPropertyValue

流程如下:

  1. 取得物件 Type
  2. 透過 Type.GetProperty(propertyName) 取得 PropertyInfo
  3. 呼叫 PropertyInfo.SetValue(obj, value, null) 完成賦值

此機制實現「慣例優於配置」:資料庫欄位名與實體屬性名一致即可自動映射。

3. 容錯設計

  • 若 PropertyInfo 為 null(屬性不存在),略過不拋出異常
  • 資料類型不匹配時由框架自動轉換或拋出可捕獲異常

擴展思路:打造輕量級 Hibernate

本範例展示核心映射邏輯,若進一步擴展可實現:

  • 屬性特性映射:以 [Column("db_field")] 標記屬性,支援欄位名不同步
  • 泛型集合回傳:將 ArrayList 升級為 List<T>,提供型別安全
  • 雙向映射:實現物件到 SQL 參數的反向生成(Insert/Update)
  • 延遲載入與快取:整合反射發射(System.Reflection.Emit)提升效能

結語

反射雖帶來效能開銷,但在資料存取層這類「開發效率優於執行效率」的場景,其價值極高。掌握此模式,即掌握了自建 ORM 框架的鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved