考虑这个是因为返回的是对象集合,需要把对象集合绑定到datagridview上,绑定datagridview需要数据源,组装数据的话,用datatable添加列很麻烦,所以用反射来实现,估计可能会有多个地方使用,可能是不同的对象使用,所以定义为泛型
class="brush:csharp;gutter:true;">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,没想到好方法,有什么好建议,请指导