你的位置:首页 > ASP.net教程

[ASP.net教程]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,没想到好方法,有什么好建议,请指导