DateTable轉換為List泛型
阿新 • • 發佈:2019-01-28
這次這個utility在兩個專案中運用,以便以後查詢,在這邊先記錄下來。
/// <summary> /// 列表工具類 /// </summary> public static class ListUtil { /// <summary> /// 複製列表,而不是引用地址改變 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <returns>結果</returns> public static IList<T> CopyList<T>(IList<T> list) { if (list != null) { IList<T> result = new List<T>(); foreach(T t in list) { result.Add(t); } return result; } return null; } } //將DataTable轉化成List泛型的方法 public class ListUtil<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ConvertToList(DataTable dt) { // 定義集合 List<T> ts = new List<T>(); // 獲得此模型的型別 Type type = typeof(T); //定義一個臨時變數 string tempName = string.Empty; //遍歷DataTable中所有的資料行 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; } }
呼叫程式碼如下:
list = ListUtil<AccPaymentTypeEntity>.ConvertToList(ds.Tables[0]);