1. 程式人生 > >DataTable與List<T>互轉

DataTable與List<T>互轉

DataTable List

平時寫代碼的時候經常會遇到DataTable與List<T>之間的轉換操作,由於DataTable數據集合不像List<T>指定了對應的T類型,所以在操作的時候沒有List<T>方便,為了方便兩個集合的轉換,特此寫下以下類記錄兩者之間的互換。 class ModelConvertHelper<T> where T : new() { /// <summary> /// 把DataTable轉換成指定類型的List /// </summary> /// <param name="dt"></param> /// <returns></returns> public static IList<T> ConvertDataTableToList(DataTable dt) { // 定義集合 IList<T> ts = new List<T>(); string tempName = ""; foreach (DataRow dr in dt.Rows) { T t = new T(); // 獲得此模型的公共屬性 PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { tempName = pi.Name; // 檢查DataTable是否包含此列 if (dt.Columns.Contains(tempName)) { // 判斷此屬性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } ts.Add(t); } return ts; } /// <summary> /// 把泛型List轉換成DataTable /// </summary> /// <param name="list"></param> /// <returns></returns> public static DataTable ConvertListToDataTable(List<T> list) { DataTable dt = new DataTable(); // 獲得此模型的公共屬性 PropertyInfo[] propertys = typeof(T).GetProperties(); foreach (PropertyInfo pi in propertys) { // 判斷此屬性是否有Getter if (!pi.CanRead) continue; dt.Columns.Add(pi.Name, pi.PropertyType); } foreach (T item in list) { propertys = item.GetType().GetProperties(); DataRow newRow = dt.NewRow(); foreach (PropertyInfo pi in propertys) { if (!pi.CanRead) continue; newRow[pi.Name] = pi.GetValue(item); } dt.Rows.Add(newRow); } return dt; } }

DataTable與List<T>互轉