平时写代码的时候经常会遇到DataTable与List<T>之间的转换操作,由于DataTable数据集合不像List<T>指定了对应的T类型,所以在操作的时候没有List<T>方便,为了方便两个集合的转换,特此写下以下类记录两者之间的互换。 class ModelConvertHelper<T> where T : new(){ /// <summary> /// 把DataTable转换成指定类型的List /// </summary> /// <param name="dt"></param> /// <returns></returns> public static IList<T> ConvertDataTableToList(DataTable dt) { // 定义集合 IList<T> ts = new List<T>(); string tempName = ""; foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { tempName = pi.Name; // 检查DataTable是否包含此列 if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } ts.Add(t); } return ts; } /// <summary> /// 把泛型List转换成DataTable /// </summary> /// <param name="list"></param> /// <returns></returns> public static DataTable ConvertListToDataTable(List<T> list) { DataTable dt = new DataTable(); // 获得此模型的公共属性 PropertyInfo[] propertys = typeof(T).GetProperties(); foreach (PropertyInfo pi in propertys) { // 判断此属性是否有Getter if (!pi.CanRead) continue; dt.Columns.Add(pi.Name, pi.PropertyType); } foreach (T item in list) { propertys = item.GetType().GetProperties(); DataRow newRow = dt.NewRow(); foreach (PropertyInfo pi in propertys) { if (!pi.CanRead) continue; newRow[pi.Name] = pi.GetValue(item); } dt.Rows.Add(newRow); } return dt; }}