C#(107):泛型舉例:List T 與DateTable相互轉換
阿新 • • 發佈:2022-05-15
一、 DataTable轉換到List
/// <summary> /// TableToList /// </summary> public class TableListConverter<T> where T : class, new() { public static IList<T> TableToList(DataTable dt) { IList<T> ts = new List<T>();// 定義集合 Type type = typeof(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; if (dt.Columns.Contains(tempName))// 檢查DataTable是否包含此列 { if (!pi.CanWrite) continue;// 判斷此屬性是否有Setter object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } ts.Add(t); } return ts; } }
應用:
// 獲得查詢結果
DataTable dt = DbHelper.ExecuteDataTable("...");
// 把DataTable轉換為IList<UserInfo>
IList<UserInfo> users = TableListConverter<UserInfo>.TableToList(dt);
二、 ****List 轉換到DataTable
/// <summary> /// ListToTable /// </summary> public class TableListConverter { public static DataTable ListToTable<T>(IList<T> list) where T : class, new() { if (list == null) return null; Type type = typeof(T); DataTable dt = new DataTable(); PropertyInfo[] properties = Array.FindAll(type.GetProperties(), p => p.CanRead);//判斷此屬性是否有Getter Array.ForEach(properties, prop => { dt.Columns.Add(prop.Name, prop.PropertyType); });//新增到列 foreach (T t in list) { DataRow row = dt.NewRow(); Array.ForEach(properties, prop => { row[prop.Name] = prop.GetValue(t, null); });//新增到行 dt.Rows.Add(row); } return dt; } }
應用:
//IList<UserInfo> users
DataTable dt =TableListConverter.ListToTable(users)