在資料存取層開發中,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),雖然開發便利,但在大量資料下效能稍遜。若有高效能需求,可考慮:
FastMember、AutoMapper 等已優化的元件。var customers = new List<Customer> { ... };
DataTable dt = customers.ToDataTable();
// 現在可直接繫結至 GridView、匯出 Excel 等
擴充方法讓轉換邏輯乾淨可復用,搭配後續的效能優化,即能滿足從原型開發到高效能生產環境的各種場景。