C# 完整的DataTable和list转换

  1 public class CollectionHelper  
  2 {  
  3     private CollectionHelper()  
  4     {  
  5     }  
  6   
  7     public static DataTable ConvertTo<T>(IList<T> list)  
  8     {  
  9         DataTable table = CreateTable<T>();  
 10         Type entityType = typeof(T);  
 11         PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);  
 12   
 13         foreach (T item in list)  
 14         {  
 15             DataRow row = table.NewRow();  
 16   
 17             foreach (PropertyDescriptor prop in properties)  
 18             {  
 19                 row[prop.Name] = prop.GetValue(item);  
 20             }  
 21   
 22             table.Rows.Add(row);  
 23         }  
 24   
 25         return table;  
 26     }  
 27   
 28     public static IList<T> ConvertTo<T>(IList<DataRow> rows)  
 29     {  
 30         IList<T> list = null;  
 31   
 32         if (rows != null)  
 33         {  
 34             list = new List<T>();  
 35   
 36             foreach (DataRow row in rows)  
 37             {  
 38                 T item = CreateItem<T>(row);  
 39                 list.Add(item);  
 40             }  
 41         }  
 42   
 43         return list;  
 44     }  
 45   
 46     public static IList<T> ConvertTo<T>(DataTable table)  
 47     {  
 48         if (table == null)  
 49         {  
 50             return null;  
 51         }  
 52   
 53         List<DataRow> rows = new List<DataRow>();  
 54   
 55         foreach (DataRow row in table.Rows)  
 56         {  
 57             rows.Add(row);  
 58         }  
 59   
 60         return ConvertTo<T>(rows);  
 61     }  
 62   
 63     public static T CreateItem<T>(DataRow row)  
 64     {  
 65         T obj = default(T);  
 66         if (row != null)  
 67         {  
 68             obj = Activator.CreateInstance<T>();  
 69   
 70             foreach (DataColumn column in row.Table.Columns)  
 71             {  
 72                 PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);  
 73                 try  
 74                 {  
 75                     object value = row[column.ColumnName];  
 76                     prop.SetValue(obj, value, null);  
 77                 }  
 78                 catch  
 79                 {  
 80                     // You can log something here  
 81                     throw;  
 82                 }  
 83             }  
 84         }  
 85   
 86         return obj;  
 87     }  
 88   
 89     public static DataTable CreateTable<T>()  
 90     {  
 91         Type entityType = typeof(T);  
 92         DataTable table = new DataTable(entityType.Name);  
 93         PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);  
 94   
 95         foreach (PropertyDescriptor prop in properties)  
 96         {  
 97             table.Columns.Add(prop.Name, prop.PropertyType);  
 98         }  
 99   
100         return table;  
101     }  
102 }  
103   
104   
105 To see the full code in action, check this sample out:  
106   
107 public class MyClass  
108 {  
109     public static void Main()  
110     {  
111         List<Customer> customers = new List<Customer>();  
112   
113         for (int i = 0; i < 10; i++)  
114         {  
115             Customer c = new Customer();  
116             c.Id = i;  
117             c.Name = "Customer " + i.ToString();  
118   
119             customers.Add(c);  
120         }  
121   
122         DataTable table = CollectionHelper.ConvertTo<Customer>(customers);  
123   
124         foreach (DataRow row in table.Rows)  
125         {  
126             Console.WriteLine("Customer");  
127             Console.WriteLine("---------------");  
128   
129             foreach (DataColumn column in table.Columns)  
130             {  
131                 object value = row[column.ColumnName];  
132                 Console.WriteLine("{0}: {1}", column.ColumnName, value);  
133             }  
134   
135             Console.WriteLine();  
136         }  
137   
138         RL();  
139     }  
140  
141     #region Helper methods  
142   
143     private static void WL(object text, params object[] args)  
144     {  
145         Console.WriteLine(text.ToString(), args);  
146     }  
147   
148     private static void RL()  
149     {  
150         Console.ReadLine();  
151     }  
152   
153     private static void Break()  
154     {  
155         System.Diagnostics.Debugger.Break();  
156     }  
157  
158     #endregion  
159 } 

 

posted @ 2019-08-22 11:08  Vaynedy  阅读(161)  评论(0编辑  收藏  举报