2012年11月11日星期日

【原】超简单类型转换(DataTable

【原】超简单类型转换(DataTable

背景:

开发工作中经常需要类型的转换,比如DataTable转换为List、或是DataTable转换为JSON等等,

每次都重复的写相同的代码,比如:把实体类的字段属性一个一个的列出来,从DataTabel中把值取出来赋上,

真的好麻烦 (*=*)

思考:

1)DataTable转换为List,主要是使用反射,遍历实体类的属性,和DataTabel中的列进行对比并赋值

2)DataTable转换为JSON,主要是拼接JSON串

实践:

参考了网上很多前辈的思路和实现,制作了一个ConvertHelper类,感谢各位前辈 ^_^

转换辅助类ConvertHelper代码如下:

ConvertHelper
  1 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

UserInfo
 1 /// <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

MockData
 1 /// <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: