C#之DataTable转List与List转Datatable

闲来无事,只有写代码啦,以下为DataTable转List与List转DataTable的两个方法,主要技术点用到了反射原理:

    /// <summary>
    /// 模型转换类
    /// </summary>
    public class ConvertModel
    {
        /// <summary>
        /// DataTable转List
        /// </summary>
        /// <typeparam name="T">list中的类型</typeparam>
        /// <param name="dt">要转换的DataTable</param>
        /// <returns></returns>
        public static List<T> DatatTableToList<T>(DataTable dt) where T : class, new()
        {
            List<T> list = new List<T>();
            T t = new T();
            PropertyInfo[] prop = t.GetType().GetProperties();
            //遍历所有DataTable的行
            foreach (DataRow dr in dt.Rows)
            {
                t = new T();
                //通过反射获取T类型的所有成员
                foreach (PropertyInfo pi in prop)
                {
                    //DataTable列名=属性名
                    if (dt.Columns.Contains(pi.Name))
                    {
                        //属性值不为空
                        if (dr[pi.Name] != DBNull.Value)
                        {
                            object value = Convert.ChangeType(dr[pi.Name], pi.PropertyType);
                            //给T类型字段赋值
                            pi.SetValue(t, value, null);
                        }
                    }
                }
                //将T类型添加到集合list
                list.Add(t);
            }
            return list;

        }

        /// <summary>
        /// List转换为DataTable
        /// </summary>
        /// <typeparam name="T">List中的类型</typeparam>
        /// <param name="list">要转换的list</param>
        /// <returns></returns>
        public static DataTable ListToDataTable<T>(List<T> list) where T : class
        {
            DataTable dt = new DataTable();
            PropertyInfo[] prop = typeof(T).GetProperties();
            DataColumn[] ColumnArr = prop.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray();
            dt.Columns.AddRange(ColumnArr);
            foreach (T t in list)
            {
                DataRow dr = dt.NewRow();
                foreach (PropertyInfo pi in prop)
                {
                    if (dt.Columns.Contains(pi.Name))
                    {
                        if (pi.GetValue(t) != null)
                        {
                            dr[pi.Name] = pi.GetValue(t);
                        }
                    }
                }
                dt.Rows.Add(dr);
            }

            return dt;
        }
    }

 调用:

            DataTable dt = new DataTable();
            dt.Columns.Add("Id");
            dt.Columns.Add("Sex");
            dt.Columns.Add("Age");
            dt.Columns.Add("Height");
            DataRow dr = dt.NewRow();
            dr["Id"] = 1;
            dr["Sex"] = 1;
            dr["Age"] = 18;
            dr["Height"] = 190;
            dt.Rows.Add(dr);
            //将DataTable转换为List<Persion>
            List<Persion> list1 = ConvertModel.DatatTableToList<Persion>(dt);


            List<Persion> list = new List<Persion>()
            {
                new Persion(){Id=1,Sex=1,Age=26,Height=168},
                new Persion(){Id=2,Sex=0,Age=26,Height=168},
            };
            //将List<Persion>转换为DataTable
            DataTable dt1 = ConvertModel.ListToDataTable<Persion>(list);

 

posted @ 2017-08-18 16:21  龙行天涯  阅读(1717)  评论(0编辑  收藏  举报