当前位置: 代码迷 >> C# >> C#反照应用
  详细解决方案

C#反照应用

热度:69   发布时间:2016-05-05 03:59:31.0
C#反射应用

考虑这个是因为返回的是对象集合,需要把对象集合绑定到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,没想到好方法,有什么好建议,请指导

  相关解决方案