考慮這個是因為返回的是對象集合,需要把對象集合綁定到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轉換成對象應該也可以用反射來做
1 public static List<T> GetObjectListHelper(DataTable dt, T obj) 2 { 3 List<T> list = new List<T>(); 4 Type type = obj.GetType(); 5 PropertyInfo[] pis = type.GetProperties(); 6 foreach (DataRow dr in dt.Rows) 7 { 8 object o = Activator.CreateInstance(type); 9 foreach (PropertyInfo pi in pis) 10 { 11 pi.SetValue(o, dr[pi.Name].ToString(), null); 12 } 13 T t = (T)o; 14 list.Add(t); 15 } 16 return list; 17 }
本來只想傳一個datatable,不想傳T,沒想到好方法,有什麼好建議,請指導