[工具類]DataTable與泛型集合List互轉


寫在前面

工作中經常遇到datatable與list,對於datatable而言操作起來不太方便。所以有的時候還是非常希望通過泛型集合來進行操作的。所以這里就封裝了一個擴展類。也方便使用。

方法中主要使用了反射的方式動態的為屬性賦值以及取值。

   public static class Extension
    {
        /// <summary>
        /// 將datatable轉換為泛型集合
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="inputDataTable"></param>
        /// <returns></returns>
        public static List<TEntity> ToList<TEntity>(this DataTable inputDataTable) where TEntity : class,new()
        {
            if (inputDataTable == null)
            {
                throw new ArgumentNullException("input datatable is null");
            }
            Type type = typeof(TEntity);
            PropertyInfo[] propertyInfos = type.GetProperties();
            List<TEntity> lstEntitys = new List<TEntity>();
            foreach (DataRow row in inputDataTable.Rows)
            {
                object obj = Activator.CreateInstance(type);
                foreach (PropertyInfo pro in propertyInfos)
                {
                    foreach (DataColumn col in inputDataTable.Columns)
                    {
                        //如果直接查詢的數據庫,數據庫是不區別大小寫的,所以轉換為小寫忽略大小寫的問題
                        if (col.ColumnName.ToLower().Equals(pro.Name.ToLower()))
                        {
                            //屬性是否是可寫的,如果是只讀的屬性跳過。
                            if (pro.CanWrite)
                            {
                                //判斷類型,基本類型,如果是其他的類屬性
                                if (pro.PropertyType == typeof(System.Int32))
                                {
                                    pro.SetValue(obj, Convert.ToInt32(row[pro.Name.ToLower()]));
                                }
                                else if (pro.PropertyType == typeof(System.String))
                                {
                                    pro.SetValue(obj, row[pro.Name.ToLower()].ToString());
                                }
                                else if (pro.PropertyType == typeof(System.Boolean))
                                {
                                    pro.SetValue(obj, Convert.ToBoolean(row[pro.Name.ToLower()]));
                                }
                                else if (pro.PropertyType == typeof(System.DateTime))
                                {
                                    pro.SetValue(obj, Convert.ToDateTime(row[pro.Name.ToLower()]));
                                }
                                else if (pro.PropertyType == typeof(System.Int64))
                                {
                                    pro.SetValue(obj, Convert.ToInt64(row[pro.Name.ToLower()]));
                                }
                                else
                                {
                                    pro.SetValue(obj, row[pro.Name.ToLower()]);
                                }

                            }
                        }
                    }
                }
                TEntity tEntity = obj as TEntity;
                lstEntitys.Add(tEntity);
            }
            return lstEntitys;
        }
        /// <summary>
        /// 將list轉換為datatable
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="inputList"></param>
        /// <returns></returns>
        public static DataTable ToDataTable<TEntity>(this List<TEntity> inputList) where TEntity : class,new()
        {
            if (inputList == null)
            {
                throw new ArgumentNullException("inputList");
            }
            DataTable dt = null;
            Type type = typeof(TEntity);
            if (inputList.Count == 0)
            {
                dt = new DataTable(type.Name);
                return dt;
            }else{dt=new DataTable();}
            PropertyInfo[] propertyInfos = type.GetProperties();
            foreach (var item in propertyInfos)
            {
                dt.Columns.Add(new DataColumn() { ColumnName = item.Name, DataType = item.PropertyType });
            }
            foreach (var item in inputList)
            {
                DataRow row = dt.NewRow();
                foreach (var pro in propertyInfos)
                {
                    row[pro.Name] = pro.GetValue(item);
                }
                dt.Rows.Add(row);
            }
            return dt;
        }

 總結

有些時候能偷懶就偷懶了,把常用的工具類自己封裝下,下次使用的時候拿來用就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM