using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CloudBuilder.Core.Utility { public class DataTableConvertor { /// /// DataTable转对象 /// /// /// public static List ConvertToList(DataTable dt) where T : new() { // 定义集合 var list = new List(); if (dt == null || 0 == dt.Rows.Count) { return list; } // 获得此模型的可写公共属性 IEnumerable propertys = typeof(T).GetProperties().Where(u => u.CanWrite); list = ConvertToEntity(dt, propertys); return list; } private static List ConvertToEntity(DataTable dt, IEnumerable propertys) where T : new() { var list = new List(); //遍历DataTable中所有的数据行 foreach (DataRow dr in dt.Rows) { if (dr.RowState == DataRowState.Deleted) continue; var entity = new T(); //遍历该对象的所有属性 foreach (PropertyInfo p in propertys) { //将属性名称赋值给临时变量 string tmpName = p.Name; //检查DataTable是否包含此列(列名==对象的属性名) if (!dt.Columns.Contains(tmpName)) continue; //取值 object value = dr[tmpName]; //如果非空,则赋给对象的属性 if (value != DBNull.Value) { p.SetValue(entity, value, null); } } //对象添加到泛型集合中 list.Add(entity); } return list; } /// /// 对象转DataTable /// /// /// public static DataTable ToDataTable(IList list) { return ToDataTable(list, false); } public static DataTable ToDataTable(IList list, bool blankOption) { Type elementType = typeof(T); var t = new DataTable(); elementType.GetProperties().ToList().ForEach(propInfo => t.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType)); if (blankOption) { var row = t.NewRow(); t.Rows.Add(row); } foreach (T item in list) { var row = t.NewRow(); elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value); t.Rows.Add(row); } return t; } public static DataTable ToDataTable(T[] list) { Type elementType = typeof(T); var t = new DataTable(); elementType.GetProperties().ToList().ForEach(propInfo => t.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType)); foreach (T item in list) { var row = t.NewRow(); elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value); t.Rows.Add(row); } return t; } } }