考虑这个是因为返回的是对象集合,需要把对象集合绑定到datagridview上,绑定datagridview需要数据源,组装数据的话,用datatable添加列很麻烦,所以用反射来实现,估计可能会有多个地方使用,可能是不同的对象使用,所以定义为泛型
public class DatatableListHelper<T> { public static DataTable GetDataTableHelper(List<T> items) { DataTable dt = new DataTable(); Type t = items[0].GetType(); PropertyInfo[] pis = t.GetProperties(); foreach (PropertyInfo pi in pis) { dt.Columns.Add(pi.Name); } foreach (T item in items) { DataRow dr = dt.NewRow(); foreach (PropertyInfo pi in pis) { object obj = pi.GetValue(item, null); switch (pi.PropertyType.Name.ToString().ToLower()) { case "datetime" : dr[pi.Name] = Convert.ToDateTime(obj).ToString("yyyy-MM-dd"); break; case "int32": dr[pi.Name] = Convert.ToInt32(obj); break; case "double": dr[pi.Name] = Convert.ToDouble(obj); break; default: dr[pi.Name] = obj; break; } } dt.Rows.Add(dr); } return dt; } }
switch里类型不是很全,需要添加一些类型
反之,如果把datatable转换成对象应该也可以用反射来做
public static List<T> GetObjectListHelper(DataTable dt, T obj) { List<T> list = new List<T>(); Type type = obj.GetType(); PropertyInfo[] pis = type.GetProperties(); foreach (DataRow dr in dt.Rows) { object o = Activator.CreateInstance(type); foreach (PropertyInfo pi in pis) { //pi.SetValue(o, dr[pi.Name].ToString(), null); switch (pi.PropertyType.Name.ToString().ToLower()) { case "datetime": pi.SetValue(o, Convert.ToDateTime(dr[pi.Name].ToString()), null); break; case "int32": pi.SetValue(o, Convert.ToInt32(dr[pi.Name].ToString()), null); break; case "double": pi.SetValue(o, Convert.ToDouble(dr[pi.Name].ToString()), null); break; default: pi.SetValue(o, dr[pi.Name].ToString(), null); break; } } T t = (T)o; list.Add(t); } return list; }
本来只想传一个datatable,不想传T,没想到好方法,有什么好建议,请指导