C# 將DataTable转换成List<T>
將DataTable转换成List<T> 代码如下
public static List<T> DataTableTurnToList<T>(DataTable dt) where T : class, new() { // 定义T類型集合 List<T> ts = new List<T>(); //定义一个临时变量 string tempName = string.Empty; //遍历DataTable中所有的数据行 foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); //遍历该对象的所有属性 foreach (PropertyInfo pi in propertys) { tempName = pi.Name;//将属性名称赋值给临时变量 if (dt.Columns.Contains(tempName)) //检查DataTable是否包含此列(列名==对象的属性名) { //取值 object value = dr[tempName]; //如果非空,则赋给对象的属性 if (value != DBNull.Value) { pi.SetValue(t, value, null); } } } //对象添加到泛型集合中 ts.Add(t); } return ts; }
上述代码使用时出现了一个错误 ,如下:
原因是我的类型里设置了可为空的属性(SEQ_NO),如下
public class ClassNumber { public string ID { get; set; } public string SN { get; set; } public string PANEL { get; set; } public string WORKORDERNO { get; set; } public double? SEQ_NO { get; set; } public string EDIT_EMP { get; set; } public DateTime EDIT_TIME { get; set; } }
修改上述实现代码如下:
public static List<T> DataTableTurnToList<T>(DataTable dt) where T : class, new() { // 定义T類型集合 List<T> ts = new List<T>(); //定义一个临时变量 string tempName = string.Empty; //遍历DataTable中所有的数据行 foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); //遍历该对象的所有属性 foreach (PropertyInfo pi in propertys) { tempName = pi.Name;//将属性名称赋值给临时变量 if (dt.Columns.Contains(tempName)) //检查DataTable是否包含此列(列名==对象的属性名) { //取值 object value = dr[tempName]; //如果非空,则赋给对象的属性 if (value != DBNull.Value) { if (pi.PropertyType.FullName.Contains("System.Nullable`1[[System.Double")) { pi.SetValue(t, value == null ? 0 : double.Parse(value.ToString())); } else if (pi.PropertyType.FullName.Contains("System.Nullable`1[[System.Int")) { pi.SetValue(t, value == null ? 0 : Convert.ToInt32(value)); } else { pi.SetValue(t, value, null); } } //pi.SetValue(t, value); } } //对象添加到泛型集合中 ts.Add(t); } return ts; }
问题是解决了,但感觉这种处理方式不是很好,如有更好的方法望指正