寫在前面
工作中經常遇到datatable與list,對於datatable而言操作起來不太方便。所以有的時候還是非常希望通過泛型集合來進行操作的。所以這里就封裝了一個擴展類。也方便使用。
類
方法中主要使用了反射的方式動態的為屬性賦值以及取值。
public static class Extension { /// <summary> /// 將datatable轉換為泛型集合 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="inputDataTable"></param> /// <returns></returns> public static List<TEntity> ToList<TEntity>(this DataTable inputDataTable) where TEntity : class,new() { if (inputDataTable == null) { throw new ArgumentNullException("input datatable is null"); } Type type = typeof(TEntity); PropertyInfo[] propertyInfos = type.GetProperties(); List<TEntity> lstEntitys = new List<TEntity>(); foreach (DataRow row in inputDataTable.Rows) { object obj = Activator.CreateInstance(type); foreach (PropertyInfo pro in propertyInfos) { foreach (DataColumn col in inputDataTable.Columns) { //如果直接查詢的數據庫,數據庫是不區別大小寫的,所以轉換為小寫忽略大小寫的問題 if (col.ColumnName.ToLower().Equals(pro.Name.ToLower())) { //屬性是否是可寫的,如果是只讀的屬性跳過。 if (pro.CanWrite) { //判斷類型,基本類型,如果是其他的類屬性 if (pro.PropertyType == typeof(System.Int32)) { pro.SetValue(obj, Convert.ToInt32(row[pro.Name.ToLower()])); } else if (pro.PropertyType == typeof(System.String)) { pro.SetValue(obj, row[pro.Name.ToLower()].ToString()); } else if (pro.PropertyType == typeof(System.Boolean)) { pro.SetValue(obj, Convert.ToBoolean(row[pro.Name.ToLower()])); } else if (pro.PropertyType == typeof(System.DateTime)) { pro.SetValue(obj, Convert.ToDateTime(row[pro.Name.ToLower()])); } else if (pro.PropertyType == typeof(System.Int64)) { pro.SetValue(obj, Convert.ToInt64(row[pro.Name.ToLower()])); } else { pro.SetValue(obj, row[pro.Name.ToLower()]); } } } } } TEntity tEntity = obj as TEntity; lstEntitys.Add(tEntity); } return lstEntitys; } /// <summary> /// 將list轉換為datatable /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="inputList"></param> /// <returns></returns> public static DataTable ToDataTable<TEntity>(this List<TEntity> inputList) where TEntity : class,new() { if (inputList == null) { throw new ArgumentNullException("inputList"); } DataTable dt = null; Type type = typeof(TEntity); if (inputList.Count == 0) { dt = new DataTable(type.Name); return dt; }else{dt=new DataTable();} PropertyInfo[] propertyInfos = type.GetProperties(); foreach (var item in propertyInfos) { dt.Columns.Add(new DataColumn() { ColumnName = item.Name, DataType = item.PropertyType }); } foreach (var item in inputList) { DataRow row = dt.NewRow(); foreach (var pro in propertyInfos) { row[pro.Name] = pro.GetValue(item); } dt.Rows.Add(row); } return dt; }
總結
有些時候能偷懶就偷懶了,把常用的工具類自己封裝下,下次使用的時候拿來用就可以了。