C#中Datatable和List互相转换

  其实早就该写的,哈哈,不过今天刚想起来注册,热热手,就写一下,哈哈。

  直接上内容吧:

  建立一个控制台应用程序,

 1             List<students> Studentlist =
 2             new List<students>{
 3                 new students{ Name = "zhagnsan1", Chinese = 101, Math = 90, English = 80 },
 4                 new students{ Name = "zhagnsan2", Chinese = 102, Math = 90, English = 80 },
 5                 new students{ Name = "zhagnsan3", Chinese = 103, Math = 90, English = 80 }
 6             };
 7             DataTable dt = ListToDatatableHelper.ToDataTable(Studentlist);
 8             this.dataGridView1.DataSource = dt;
 9 
10             List<students> list = DatatableToListHelper.ConvertToList(dt);
11 
12           public class students
13           {
14             public string Name { get; set; }
15             public double English { get; set; }
16             public double Chinese { get; set; }
17             public double Math { get; set; }
18           }

  ListToDatatableHelper.cs中的内容为:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Data;
  4 using System.Linq;
  5 using System.Reflection;
  6 using System.Text;
  7 using System.Threading.Tasks;
  8 
  9 namespace ListToDatatable
 10 {
 11     public class ListToDatatableHelper
 12     {
 13         /// <summary>
 14         /// Convert a List{T} to a DataTable.
 15         /// </summary>
 16         public static DataTable ToDataTable<T>(List<T> items)
 17         {
 18             var tb = new DataTable(typeof(T).Name);
 19 
 20             PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
 21 
 22             foreach (PropertyInfo prop in props)
 23             {
 24                 Type t = GetCoreType(prop.PropertyType);
 25                 tb.Columns.Add(prop.Name, t);
 26             }
 27 
 28             foreach (T item in items)
 29             {
 30                 var values = new object[props.Length];
 31 
 32                 for (int i = 0; i < props.Length; i++)
 33                 {
 34                     values[i] = props[i].GetValue(item, null);
 35                 }
 36 
 37                 tb.Rows.Add(values);
 38             }
 39 
 40             return tb;
 41         }
 42 
 43         /// <summary>
 44         /// Determine of specified type is nullable
 45         /// </summary>
 46         public static bool IsNullable(Type t)
 47         {
 48             return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
 49         }
 50 
 51         /// <summary>
 52         /// Return underlying type if type is Nullable otherwise return the type
 53         /// </summary>
 54         public static Type GetCoreType(Type t)
 55         {
 56             if (t != null && IsNullable(t))
 57             {
 58                 if (!t.IsValueType)
 59                 {
 60                     return t;
 61                 }
 62                 else
 63                 {
 64                     return Nullable.GetUnderlyingType(t);
 65                 }
 66             }
 67             else
 68             {
 69                 return t;
 70             }
 71         }
 72 
 73         //*************************************************
 74         /// <summary>
 75         /// List转Datatable
 76         /// </summary>
 77         /// <typeparam name="T"></typeparam>
 78         /// <param name="table"></param>
 79         /// <returns></returns>
 80         public static IList<T> ConvertTo<T>(DataTable table)
 81         {
 82             if (table == null)
 83             {
 84                 return null;
 85             }
 86 
 87             List<DataRow> rows = new List<DataRow>();
 88 
 89             foreach (DataRow row in table.Rows)
 90             {
 91                 rows.Add(row);
 92             }
 93 
 94             return ConvertTo<T>(rows);
 95         }
 96 
 97         public static IList<T> ConvertTo<T>(IList<DataRow> rows)
 98         {
 99             IList<T> list = null;
100 
101             if (rows != null)
102             {
103                 list = new List<T>();
104 
105                 foreach (DataRow row in rows)
106                 {
107                     T item = CreateItem<T>(row);
108                     list.Add(item);
109                 }
110             }
111 
112             return list;
113         }
114 
115         public static T CreateItem<T>(DataRow row)
116         {
117             T obj = default(T);
118             if (row != null)
119             {
120                 obj = Activator.CreateInstance<T>();
121 
122                 foreach (DataColumn column in row.Table.Columns)
123                 {
124                     PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);
125                     try
126                     {
127                         object value = row[column.ColumnName];
128                         prop.SetValue(obj, value, null);
129                     }
130                     catch
131                     {  //You can log something here     
132                        //throw;    
133                     }
134                 }
135             }
136 
137             return obj;
138         }
139     }
140 }

 

 

  DatatableToListHelper.cs中的内容为:

 1 using NPOI.SS.Formula.Functions;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Data;
 5 using System.Linq;
 6 using System.Reflection;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using static ListToDatatable.Form1;
10 
11 namespace ListToDatatable
12 {
13     class DatatableToListHelper
14     {
15         /// <summary>  
16         /// 利用反射和泛型  
17         /// </summary>  
18         /// <param name="dt"></param>  
19         /// <returns></returns>  
20         public static List<students> ConvertToList(DataTable dt)
21         {
22             // 定义集合  
23             List<students> ts = new List<students>();
24 
25             // 获得此模型的类型  
26             Type type = typeof(students);
27             //定义一个临时变量  
28             string tempName = string.Empty;
29             //遍历DataTable中所有的数据行  
30             foreach (DataRow dr in dt.Rows)
31             {
32                 students t = new students();
33                 // 获得此模型的公共属性  
34                 PropertyInfo[] propertys = t.GetType().GetProperties();
35                 //遍历该对象的所有属性  
36                 foreach (PropertyInfo pi in propertys)
37                 {
38                     tempName = pi.Name;//将属性名称赋值给临时变量  
39                     //检查DataTable是否包含此列(列名==对象的属性名)    
40                     if (dt.Columns.Contains(tempName))
41                     {
42                         // 判断此属性是否有Setter  
43                         if (!pi.CanWrite) continue;//该属性不可写,直接跳出  
44                         //取值  
45                         object value = dr[tempName];
46                         //如果非空,则赋给对象的属性  
47                         if (value != DBNull.Value)
48                             pi.SetValue(t, value, null);
49                     }
50                 }
51                 //对象添加到泛型集合中  
52                 ts.Add(t);
53             }
54             return ts;
55         }
56     }
57 }

  OK,这是引用类型的list转datatable,完毕。

 

posted @ 2017-08-14 16:01  没有梦想也没有妳  阅读(9840)  评论(4编辑  收藏  举报