C#中DataTable與List的互轉
阿新 • • 發佈:2018-11-26
1、建立DataTable擴充套件方法類(DataTableExtend.cs)
using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespace MyTest.OA.Common { /// <summary> /// DataTable擴充套件方法類 /// </summary> public static class DataTableExtend { /// <summary> /// DataTable轉成List /// </summary> public static List<T> ToDataList<T>(this DataTable dt) { var list = new List<T>(); var plist = new List<PropertyInfo>(typeof(T).GetProperties()); if (dt == null || dt.Rows.Count == 0) { return null; } 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轉成實體物件 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <returns></returns> public static T ToDataEntity<T>(this DataTable dt) { T s = Activator.CreateInstance<T>(); if (dt == null || dt.Rows.Count == 0) { return default(T); } 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> /// List轉成DataTable /// </summary> /// <typeparam name="T">實體型別</typeparam> /// <param name="entities">實體集合</param> public static DataTable ToDataTable<T>(List<T> entities) { if (entities == null || entities.Count == 0) { return null; } 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、其它程式碼
2.1 建立使用者資訊類(UserInfo.cs)
/// <summary> /// 使用者資訊類 /// </summary> public class UserInfo { /// <summary> /// 編號 /// </summary> public int ID { get; set; } /// <summary> /// 名稱 /// </summary> public string Name { get; set; } /// <summary> /// 年齡 /// </summary> public int Age { get; set; } /// <summary> /// 成績 /// </summary> public double Score { get; set; } /// <summary> /// 建立時間 /// </summary> public DateTime? CreateTime { get; set; } }
2.2 建立DataTable物件的方法
/// <summary> /// 建立DataTable物件 /// </summary> public static DataTable CreateDataTable() { //建立DataTable DataTable dt = new DataTable("NewDt"); //建立自增長的ID列 DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32")); dc.AutoIncrement = true; //自動增加 dc.AutoIncrementSeed = 1; //起始為1 dc.AutoIncrementStep = 1; //步長為1 dc.AllowDBNull = false; //非空 //建立其它列表 dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String"))); dt.Columns.Add(new DataColumn("Age", Type.GetType("System.Int32"))); dt.Columns.Add(new DataColumn("Score", Type.GetType("System.Decimal"))); dt.Columns.Add(new DataColumn("CreateTime", Type.GetType("System.DateTime"))); //建立資料 DataRow dr = dt.NewRow(); dr["Name"] = "張三"; dr["Age"] = 28; dr["Score"] = 85.5; dr["CreateTime"] = DateTime.Now; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "李四"; dr["Age"] = 24; dr["Score"] = 72; dr["CreateTime"] = DateTime.Now; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "王五"; dr["Age"] = 36; dr["Score"] = 63.5; dr["CreateTime"] = DateTime.Now; dt.Rows.Add(dr); return dt; }
3、測試
3.1 新增引用:
using MyTest.OA.Common;
3.2 測試方法:
//建立一個DataTable物件
DataTable dt = CreateDataTable();
//1、DataTable轉成List
List<UserInfo> userList = dt.ToDataList<UserInfo>();
//2、DataTable轉成實體物件
UserInfo user = dt.ToDataEntity<UserInfo>();
//3、List轉成DataTable
DataTable dt2 = DataTableExtend.ToDataTable<UserInfo>(userList);