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

擴充方法實作:DataTable 與 List<T> 雙向轉換

     編輯:關於C語言

前言

在資料存取層開發中,DataTable 與泛型集合 List<T> 互相轉換是常見需求。前一篇介紹了 DataTable 轉 List<T>,本篇實作反向轉換:將 IEnumerable<T> 轉為 DataTable。

核心程式碼實作

/// <summary>
/// 將 IEnumerable<T> 轉換為 DataTable
/// </summary>
public static DataTable ToDataTable<TResult>(this IEnumerable<TResult> value) where TResult : class
{
    // 取得型別的所有公用屬性
    var pList = typeof(TResult).GetProperties().ToList();
    var dt = new DataTable();

    // 建立欄位
    pList.ForEach(p => dt.Columns.Add(p.Name, p.PropertyType));

    // 填入資料
    foreach (var item in value)
    {
        var row = dt.NewRow();
        pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
        dt.Rows.Add(row);
    }
    return dt;
}

效能考量與優化方向

上述實作仰賴反射(PropertyInfo.GetValue),雖然開發便利,但在大量資料下效能稍遜。若有高效能需求,可考慮:

  • Expression Tree 動態編譯 Lambda:將屬性存取封裝為委派,避免重複反射查詢。
  • IL Emit / Source Generator:編譯期產生強型別轉換器,達到原生效能。
  • 第三方庫:如 FastMember、AutoMapper 等已優化的元件。

使用範例

var customers = new List<Customer> { ... };
DataTable dt = customers.ToDataTable();
// 現在可直接繫結至 GridView、匯出 Excel 等

結語

擴充方法讓轉換邏輯乾淨可復用,搭配後續的效能優化,即能滿足從原型開發到高效能生產環境的各種場景。

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