方法 1
using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespace BT.Preservation.Models { public static class ExtendMethod { /// <summary> /// DataTable转成List /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <returns></returns> public static List<T> ToDataList<T>(this DataTable dt) { var list = new List<T>(); var plist = new List<PropertyInfo>(typeof(T).GetProperties()); foreach (DataRow item in dt.Rows) { T s = Activator.CreateInstance<T>(); for (int i = 0; i < dt.Columns.Count; i++) { PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName); if (info != null) { try { if (!Convert.IsDBNull(item[i])) { object v = null; if (info.PropertyType.ToString().Contains("System.Nullable")) { v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType)); } else { v = Convert.ChangeType(item[i],info.PropertyType); } info.SetValue(s, v, null); } } catch (Exception ex) { throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message); } } } list.Add(s); } return list; } /// <summary> /// DataTable转成Dto /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <returns></returns> public static T ToDataDto<T>(this DataTable dt) { T s = Activator.CreateInstance<T>(); if (dt == null || dt.Rows.Count == 0) { return s; } var plist = new List<PropertyInfo>(typeof(T).GetProperties()); for (int i = 0; i < dt.Columns.Count; i++) { PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName); if (info != null) { try { if (!Convert.IsDBNull(dt.Rows[0][i])) { object v = null; if (info.PropertyType.ToString().Contains("System.Nullable")) { v = Convert.ChangeType(dt.Rows[0][i], Nullable.GetUnderlyingType(info.PropertyType)); } else { v = Convert.ChangeType(dt.Rows[0][i], info.PropertyType); } info.SetValue(s, v, null); } } catch (Exception ex) { throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message); } } } return s; } /// <summary> /// 将实体集合转换为DataTable /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="entities">实体集合</param> public static DataTable ToDataTable<T>(List<T> entities) { var result = CreateTable<T>(); FillData(result, entities); return result; } /// <summary> /// 创建表 /// </summary> private static DataTable CreateTable<T>() { var result = new DataTable(); var type = typeof(T); foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) { var propertyType = property.PropertyType; if ((propertyType.IsGenericType) && (propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))) propertyType = propertyType.GetGenericArguments()[0]; result.Columns.Add(property.Name, propertyType); } return result; } /// <summary> /// 填充数据 /// </summary> private static void FillData<T>(DataTable dt, IEnumerable<T> entities) { foreach (var entity in entities) { dt.Rows.Add(CreateRow(dt, entity)); } } /// <summary> /// 创建行 /// </summary> private static DataRow CreateRow<T>(DataTable dt, T entity) { DataRow row = dt.NewRow(); var type = typeof(T); foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) { row[property.Name] = property.GetValue(entity) ?? DBNull.Value; } return row; } } }
方法2(推荐):
//Newtonsoft.Json 序列化反序列化 List<model> lis = new List<model>(); model model = new model() { ID = 10, MyValue = 20 }; lis.Add(model); //Newtonsoft.Json List转DataTable DataTable dataTable = JsonConvert.DeserializeObject<DataTable>(JsonConvert.SerializeObject(lis).ToString()); //Newtonsoft.Json DataTable转List lis = new List<model>(); lis = JsonConvert.DeserializeObject<List<model>>(JsonConvert.SerializeObject(dataTable).ToString());