【原】超简单类型转换(DataTable
背景:
开发工作中经常需要类型的转换,比如DataTable转换为List、或是DataTable转换为JSON等等,
每次都重复的写相同的代码,比如:把实体类的字段属性一个一个的列出来,从DataTabel中把值取出来赋上,
真的好麻烦 (*=*)
思考:
1)DataTable转换为List,主要是使用反射,遍历实体类的属性,和DataTabel中的列进行对比并赋值
2)DataTable转换为JSON,主要是拼接JSON串
实践:
参考了网上很多前辈的思路和实现,制作了一个ConvertHelper类,感谢各位前辈 ^_^
转换辅助类ConvertHelper代码如下:
ConvertHelper1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Reflection; 5 using System.Text; 6 7 namespace ConvertDemo.CommonUtility 8 { 9 /// <summary> 10 /// 转换辅助类 11 /// </summary> 12 /// <typeparam name="T"></typeparam> 13 public class ConvertHelper<T> where T : new() 14 { 15 /// <summary> 16 /// DataTable-->List 17 /// </summary> 18 /// <param name="dt">DataTable</param> 19 /// <returns></returns> 20 public static IList<T> DataTableConvertToList(DataTable dt) 21 { 22 IList<T> ts = new List<T>(); 23 24 // 取得泛型的类型 25 Type type = typeof(T); 26 27 // 创建类型的对象(用于比较用) 28 object convertObj = Activator.CreateInstance(type, null); 29 30 // 反射取得类型实例的属性数组 31 PropertyInfo[] propertys = convertObj.GetType().GetProperties(); 32 33 foreach (DataRow dr in dt.Rows) 34 { 35 // 创建类型的对象(用于赋值用) 36 object outputObj = Activator.CreateInstance(type, null); 37 38 foreach (PropertyInfo pi in propertys) 39 { 40 // 如果DataTable的数据列中包含有对应的属性 41 if (dt.Columns.Contains(pi.Name)) 42 { 43 if (!pi.CanWrite) 44 { 45 continue; 46 } 47 48 // 取得属性的值 49 object value = dr[pi.Name]; 50 51 if (value != DBNull.Value) 52 { 53 // 将对应属性的值赋给创建的类型实例的对应的属性 54 pi.SetValue(outputObj, value, null); 55 } 56 } 57 } 58 59 // 添加到List中 60 ts.Add((T)outputObj); 61 } 62 63 return ts; 64 } 65 66 /// <summary> 67 /// DataTable-->Json 68 /// </summary> 69 /// <param name="dt">DataTable</param> 70 /// <returns></returns> 71 public static string DataTableConvertToJson(DataTable dt) 72 { 73 StringBuilder jsonBuilder = new StringBuilder(); 74 75 // 拼接JSON串 76 jsonBuilder.Append("{\""); 77 jsonBuilder.Append(dt.TableName); 78 jsonBuilder.Append("\":["); 79 for (int i = 0; i < dt.Rows.Count; i++) 80 { 81 jsonBuilder.Append("{"); 82 for (int j = 0; j < dt.Columns.Count; j++) 83 { 84 jsonBuilder.Append("\""); 85 jsonBuilder.Append(dt.Columns[j].ColumnName); 86 jsonBuilder.Append("\":\""); 87 jsonBuilder.Append(dt.Rows[i][j].ToString()); 88 jsonBuilder.Append("\","); 89 } 90 jsonBuilder.Remove(jsonBuilder.Length - 1, 1); 91 jsonBuilder.Append("},"); 92 } 93 jsonBuilder.Remove(jsonBuilder.Length - 1, 1); 94 jsonBuilder.Append("]"); 95 jsonBuilder.Append("}"); 96 97 return jsonBuilder.ToString(); 98 } 99 100 /// <summary>101 /// DataSet-->Json102 /// </summary>103 /// <param name="ds">DataSet</param>104 /// <returns></returns>105 public static string DataSetConvertToJson(DataSet ds)106 {107 StringBuilder json = new StringBuilder();108 109 foreach (DataTable dt in ds.Tables)110 {111 // 拼接JSON串112 json.Append("{\"");113 json.Append(dt.TableName);114 json.Append("\":");115 json.Append(DataTableConvertToJson(dt));116 json.Append("}");117 } return json.ToString();118 }119 }120 }
如何使用呢?
很方便的,先定义一个实体类UserInfo
UserInfo1 /// <summary> 2 /// 用户信息实体 3 /// </summary> 4 public class UserInfo 5 { 6 /// <summary> 7 /// 用户编号 8 /// </summary> 9 public int UserID { get; set; }10 11 /// <summary>12 /// 用户姓名13 /// </summary>14 public string UserName { get; set; }15 16 /// <summary>17 /// 用户薪资18 /// </summary>19 public decimal Salary { get; set; }20 }
再定义一个方法填充一些数据模拟DataTable
MockData1 /// <summary> 2 /// 模拟数据 3 /// </summary> 4 /// <returns></returns> 5 private static DataTable MockData() 6 { 7 DataTable dt = new DataTable("UserInfo"); 8 9 // 添加数据列10 DataColumn dc = null;11 12 dc = dt.Columns.Add("UserID", Type.GetType("System.Int32"));13 dc.AutoIncrement = true; //自动增加14 dc.AutoIncrementSeed = 1; //起始为115 dc.AutoIncrementStep = 1; //步长为116 dc.AllowDBNull = false;17 18 dc = dt.Columns.Add("UserName", Type.GetType("System.String"));19 dc = dt.Columns.Add("Salary", Type.GetType("System.Decimal"));20 21 #region 添加数据行22 23 // 方式124 //DataRow dr = null;25 26 //dr = dt.NewRow();27 //dr["UserName"] = "洪自军";28 //dr["Salary"] = 123.45;29 //dt.Rows.Add(dr);30 31 //dr = dt.NewRow();32 //dr["UserName"] = "武建昌";33 //dr["Salary"] = 987.65;34 //dt.Rows.Add(dr);35 36 // 方式237 dt.Rows.Add(new object[] { null, "張洋", 123.45 });38 dt.Rows.Add(new object[] { null, "張兄家", 987.65 });39 dt.Rows.Add(new object[] { null, "王生杰", 111.11 });40 dt.Rows.Add(new object[] { null, "呉QQ", 888.88 });41 dt.Rows.Add(new object[] { null, "劉瑞", 222.22 });42 43 #endregion44 45 return dt;46 }
调用转换辅助类进行转换
转换处理1 /// <summary> 2 /// DataTable-->Json测试 3 /// </summary> 4 private static void MockDataTableConvertToJson() 5 { 6 string jsonString = ConvertHelper<UserInfo>.DataTableConvertToJson(MockData()); 7 8 Console.WriteLine(jsonString); 9 }10 11 /// <summary>12 /// DataTable-->List测试13 /// </summary>14 private static void MockDataTableConvertToList()15 {16 IList<UserInfo> users = ConvertHelper<UserInfo>.DataTableConvertToList(MockData());17 18 foreach (var user in users)19 {20 Console.WriteLine("{0} : {1} - {2};", user.UserID, user.UserName, user.Salary);21 }22 }
可以看到转换后的效果
前几条数据是DataTable转换为List的效果,后一条数据是DataTable转换为JSON的效果
是不是很简单呢?
如果您有好的实现或是意见,别忘了告诉我哦 ^_^
TAG: