写在前面
工作中经常遇到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;}
总结
有些时候能偷懒就偷懒了,把常用的工具类自己封装下,下次使用的时候拿来用就可以了。