zoukankan      html  css  js  c++  java
  • 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转换成对象应该也可以用反射来做

    public static List<T> GetObjectListHelper(DataTable dt, T obj)
            {
                List<T> list = new List<T>();
                Type type = obj.GetType();
                PropertyInfo[] pis = type.GetProperties();
                foreach (DataRow dr in dt.Rows)
                {
                    object o = Activator.CreateInstance(type);
                    foreach (PropertyInfo pi in pis)
                    {
                        //pi.SetValue(o, dr[pi.Name].ToString(), null);
                        switch (pi.PropertyType.Name.ToString().ToLower())
                        {
                            case "datetime":
                                pi.SetValue(o, Convert.ToDateTime(dr[pi.Name].ToString()), null);
                                break;
                            case "int32":
                                pi.SetValue(o, Convert.ToInt32(dr[pi.Name].ToString()), null);
                                break;
                            case "double":
                                pi.SetValue(o, Convert.ToDouble(dr[pi.Name].ToString()), null);
                                break;
                            default:
                                pi.SetValue(o, dr[pi.Name].ToString(), null);
                                break;
                        }
                    }
                    T t = (T)o;
                    list.Add(t);
                }
                return list;
            }

    本来只想传一个datatable,不想传T,没想到好方法,有什么好建议,请指导

  • 相关阅读:
    [linux内存]伙伴系统学习笔记(二)--内存系统初始化
    [linux内存]伙伴系统学习笔记(一)——概念
    Android 快速开发框架Afinal
    微信公众平台搭建
    Web Eclipse不识别HttpServlet
    Android 监听来电和去电状态
    Android 监听程序的安装和卸载
    Android 被忽略的UI检视利器:Hierarchy Viewer .
    Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
    Android 系统手机端抓包方法
  • 原文地址:https://www.cnblogs.com/JohnnyBao/p/4462678.html
Copyright © 2011-2022 走看看