考慮這個是因為返回的是對象集合,需要把對象集合綁定到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,沒想到好方法,有什麼好建議,請指導