List转Datatable 新方法

方法1,最简单的转换

DataTable dt = new DataTable();            

dt.Columns.Add("id");            

dt.Columns.Add("name");

dt.Rows.Add(new object[]{ 0,"顶层菜单"});            

foreach (var cm in comdList)            

{            

DataRow dr = dt.NewRow();             

dr["id"] = cm.SYS_COMMANDS_ID;             

dr["name"] = cm.TXT_COMMANDTITLE;            

dt.Rows.Add(dr);            

}

方法2,建立类

 

public static class DataTableExtensions

    {

        /// <summary>   

 

        /// 转化一个DataTable   

 

        /// </summary>   

 

        /// <typeparam name="T"></typeparam>   

        /// <param name="list"></param>   

        /// <returns></returns>   

        public static DataTable ToDataTable<T>(this IEnumerable<T> list)

        {

 

            //创建属性的集合   

            List<PropertyInfo> pList = new List<PropertyInfo>();

            //获得反射的入口   

 

            Type type = typeof(T);

            DataTable dt = new DataTable();

            //把所有的public属性加入到集合 并添加DataTable的列   

            Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });

            foreach (var item in list)

            {

                //创建一个DataRow实例   

                DataRow row = dt.NewRow();

                //给row 赋值   

                pList.ForEach(p => row[p.Name] = p.GetValue(item, null));

                //加入到DataTable   

                dt.Rows.Add(row);

            }

            return dt;

        }

 

 

        /// <summary>   

        /// DataTable 转换为List 集合   

        /// </summary>   

        /// <typeparam name="TResult">类型</typeparam>   

        /// <param name="dt">DataTable</param>   

        /// <returns></returns>   

        public static List<T> ToList<T>(this DataTable dt) where T : class, new()

        {

            //创建一个属性的列表   

            List<PropertyInfo> prlist = new List<PropertyInfo>();

            //获取TResult的类型实例  反射的入口   

 

            Type t = typeof(T);

 

            //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表    

            Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });

 

            //创建返回的集合   

 

            List<T> oblist = new List<T>();

 

            foreach (DataRow row in dt.Rows)

            {

                //创建TResult的实例   

                T ob = new T();

                //找到对应的数据  并赋值   

                prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });

                //放入到返回的集合中.   

                oblist.Add(ob);

            }

            return oblist;

        }

 

 

 

 

        /// <summary>   

        /// 将集合类转换成DataTable   

        /// </summary>   

        /// <param name="list">集合</param>   

        /// <returns></returns>   

        public static DataTable ToDataTableTow(IList list)

        {

            DataTable result = new DataTable();

            if (list.Count > 0)

            {

                PropertyInfo[] propertys = list[0].GetType().GetProperties();

 

                foreach (PropertyInfo pi in propertys)

                {

                    result.Columns.Add(pi.Name, pi.PropertyType);

                }

                for (int i = 0; i < list.Count; i++)

                {

                    ArrayList tempList = new ArrayList();

                    foreach (PropertyInfo pi in propertys)

                    {

                        object obj = pi.GetValue(list[i], null);

                        tempList.Add(obj);

                    }

                    object[] array = tempList.ToArray();

                    result.LoadDataRow(array, true);

                }

            }

            return result;

        }

 

 

        /**/

 

        /// <summary>   

        /// 将泛型集合类转换成DataTable   

 

        /// </summary>   

        /// <typeparam name="T">集合项类型</typeparam>   

 

        /// <param name="list">集合</param>   

        /// <returns>数据集(表)</returns>   

        public static DataTable ToDataTable<T>(IList<T> list)

        {

            return ToDataTable<T>(list, null);

 

        }

 

 

        /**/

 

        /// <summary>   

        /// 将泛型集合类转换成DataTable   

        /// </summary>   

        /// <typeparam name="T">集合项类型</typeparam>   

        /// <param name="list">集合</param>   

        /// <param name="propertyName">需要返回的列的列名</param>   

        /// <returns>数据集(表)</returns>   

        public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)

        {

            List<string> propertyNameList = new List<string>();

            if (propertyName != null)

                propertyNameList.AddRange(propertyName);

            DataTable result = new DataTable();

            if (list.Count > 0)

            {

                PropertyInfo[] propertys = list[0].GetType().GetProperties();

                foreach (PropertyInfo pi in propertys)

                {

                    if (propertyNameList.Count == 0)

                    {

                        if (pi.PropertyType.FullName.Contains("Nullable")) result.Columns.Add(pi.Name);

                        else result.Columns.Add(pi.Name, pi.PropertyType);

                    }

                    else

                    {

                        if (propertyNameList.Contains(pi.Name))

                        {

                            if (pi.PropertyType.FullName.Contains("Nullable")) result.Columns.Add(pi.Name);

                            else result.Columns.Add(pi.Name, pi.PropertyType);

                        }

                    }

                }

 

                for (int i = 0; i < list.Count; i++)

                {

                    ArrayList tempList = new ArrayList();

                    foreach (PropertyInfo pi in propertys)

                    {

                        if (propertyNameList.Count == 0)

                        {

                            object obj = pi.GetValue(list[i], null);

                            tempList.Add(obj);

                        }

                        else

                        {

                            if (propertyNameList.Contains(pi.Name))

                            {

                                object obj = pi.GetValue(list[i], null);

                                tempList.Add(obj);

                            }

                        }

                    }

                    object[] array = tempList.ToArray();

                    result.LoadDataRow(array, true);

                }

            }

            return result;

        }

    }

 

posted on 2017-09-03 22:00  mol1995  阅读(451)  评论(0编辑  收藏  举报

导航