前一篇有學習過《把List<T>轉換為DataTable》http://www.cnblogs.com/insus/p/8043173.html 那此篇,將是學習反向,把DataTable轉換為List<T>。這個方法使用的較多。很多情況之後,從數據讀出來的數據是DataSet或是DataTable ...
前一篇有學習過《把List<T>轉換為DataTable》http://www.cnblogs.com/insus/p/8043173.html
那此篇,將是學習反向,把DataTable轉換為List<T>。這個方法使用的較多。很多情況之後,從數據讀出來的數據是DataSet或是DataTable。需要把它們轉換為List<T>之後,再轉換為json。
public static List<T> ToList<T>(this DataTable dt) { var dataColumn = dt.Columns.Cast<DataColumn>().Select(c => c.ColumnName).ToList(); var properties = typeof(T).GetProperties(); string columnName = string.Empty; return dt.AsEnumerable().Select(row => { var t = Activator.CreateInstance<T>(); foreach (var p in properties) { columnName = p.Name; if (dataColumn.Contains(columnName)) { if (!p.CanWrite) continue; object value = row[columnName]; Type type = p.PropertyType; if (value != DBNull.Value) { p.SetValue(t, Convert.ChangeType(value, type), null); } } } return t; }).ToList(); }Source Code
接下來,手動創建一個DataTable,添加一些數據行。對象是引用前一篇的對象:
class Ba { public void ConvertDataTableToListToTestDemo() { DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Account", typeof(string)); dt.Columns.Add("Email", typeof(string)); dt.Rows.Add(1, "A0001", "[email protected]"); dt.Rows.Add(2, "A0002", "[email protected]"); dt.Rows.Add(3, "A0003", "[email protected]"); List<Ay> ays = dt.ToList<Ay>(); ays.ForEach(delegate (Ay ay) { Console.WriteLine(ay.ToString()); }); Console.WriteLine("\n\r"); } }Source Code
上圖紅框即是#23行代碼,就是本篇的核心代碼,把DataTable轉換為List<T>。