datatable与实体相互转换 反射

namespace Mall.Config{/// <summary>
    /// DataTable与实体类互相转换
    /// </summary>
    /// <typeparam name="T">实体类</typeparam>
    public class ModelHandler<T> where T : new()
    {
        #region DataTable转换成实体类

        /// <summary>
        /// 填充对象列表:用DataSet的第一个表填充实体类
        /// </summary>
        /// <param name="ds">DataSet</param>
        /// <returns></returns>
        public List<T> FillModel(DataSet ds)
        {
            if (ds == null || ds.Tables[0] == null || ds.Tables[0].Rows.Count == 0)
            {
                return null;
            }
            else
            {
                return FillModel(ds.Tables[0]);
            }
        }

        /// <summary>
        /// 填充对象列表:用DataSet的第index个表填充实体类
        /// </summary>
        public List<T> FillModel(DataSet ds, int index)
        {
            if (ds == null || ds.Tables.Count <= index || ds.Tables[index].Rows.Count == 0)
            {
                return null;
            }
            else
            {
                return FillModel(ds.Tables[index]);
            }
        }

        /// <summary>
        /// 填充对象列表:用DataTable填充实体类
        /// </summary>
        public List<T> FillModel(DataTable dt)
        {
            if (dt == null || dt.Rows.Count == 0)
            {
                return null;
            }
            List<T> modelList = new List<T>();
            foreach (DataRow dr in dt.Rows)
            {
                //T model = (T)Activator.CreateInstance(typeof(T));
                T model = new T();
                for (int i = 0; i < dr.Table.Columns.Count; i++)
                {
                    PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName);
                    if (propertyInfo != null && dr[i] != DBNull.Value)
                        propertyInfo.SetValue(model, dr[i], null);
                }

                modelList.Add(model);
            }
            return modelList;
        }

        /// <summary>
        /// 填充对象:用DataRow填充实体类
        /// </summary>
        public T FillModel(DataRow dr)
        {
            if (dr == null)
            {
                return default(T);
            }

            //T model = (T)Activator.CreateInstance(typeof(T));
            T model = new T();

            for (int i = 0; i < dr.Table.Columns.Count; i++)
            {
                PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName);
                if (propertyInfo != null && dr[i] != DBNull.Value)
                    propertyInfo.SetValue(model, dr[i], null);
            }
            return model;
        }

        #endregion

        #region 实体类转换成DataTable

        /// <summary>
        /// 实体类转换成DataSet
        /// </summary>
        /// <param name="modelList">实体类列表</param>
        /// <returns></returns>
        public DataSet FillDataSet(List<T> modelList)
        {
            if (modelList == null || modelList.Count == 0)
            {
                return null;
            }
            else
            {
                DataSet ds = new DataSet();
                ds.Tables.Add(FillDataTable(modelList));
                return ds;
            }
        }

        /// <summary>
        /// 实体类转换成DataTable
        /// </summary>
        /// <param name="modelList">实体类列表</param>
        /// <returns></returns>
        public DataTable FillDataTable(List<T> modelList)
        {
            if (modelList == null || modelList.Count == 0)
            {
                return null;
            }
            DataTable dt = CreateData(modelList[0]);

            foreach (T model in modelList)
            {
                DataRow dataRow = dt.NewRow();
                foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
                {
                    dataRow[propertyInfo.Name] = propertyInfo.GetValue(model, null);
                }
                dt.Rows.Add(dataRow);
            }
            return dt;
        }

        /// <summary>
        /// 根据实体类得到表结构
        /// </summary>
        /// <param name="model">实体类</param>
        /// <returns></returns>
        private DataTable CreateData(T model)
        {
            DataTable dataTable = new DataTable(typeof(T).Name);
            foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
            {
                dataTable.Columns.Add(new DataColumn(propertyInfo.Name, propertyInfo.PropertyType));
            }
            return dataTable;
        }

        /// <summary>
        /// 实体类转换成DataTable
        /// </summary>
        /// <param name="modelList">实体类列表</param>
        /// <param name="nameList">具体列集合</param>
        /// <returns></returns>
        public DataTable FillDataTable(List<T> modelList, List<string> nameList)
        {
            if (modelList == null || modelList.Count == 0)
            {
                return null;
            }
            DataTable dt = CreateData(modelList[0], nameList);

            foreach (T model in modelList)
            {
                DataRow dataRow = dt.NewRow();
                foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
                {
                    foreach (string item in nameList)
                    {
                        string[] arr = item.Split(‘,‘);
                        if (arr[0] == propertyInfo.Name)
                        {
                            string temp = "";
                            switch (arr[2])
                            {
                                case "Int":
                                    temp = propertyInfo.GetValue(model, null).ToString() == "无数据"
                                        ? propertyInfo.GetValue(model, null).ToString()
                                        : Math.Round((double)propertyInfo.GetValue(model, null), 0).ToString();
                                    break;
                                case "Double":
                                    if (propertyInfo.GetValue(model, null).ToString() == "--")
                                        temp = "--";
                                    else if (propertyInfo.GetValue(model, null).ToString() == "无数据")
                                        temp = "无数据";
                                    else if (propertyInfo.GetValue(model, null).ToString().Contains("%"))
                                        temp = propertyInfo.GetValue(model, null).ToString();
                                    else
                                        temp = Math.Round((double)propertyInfo.GetValue(model, null), 2).ToString();
                                    break;
                                default:
                                    if (propertyInfo.GetValue(model, null) != null)
                                    {
                                        temp = propertyInfo.GetValue(model, null).ToString();
                                    }
                                    break;
                            }
                            dataRow[arr[1]] = temp;
                        }
                    }

                    //if (nameList.Contains(propertyInfo.Name))
                    //{
                    //    string temp = "";
                    //    temp = (propertyInfo.PropertyType).FullName == "System.Double"
                    //        ? Math.Round((double)propertyInfo.GetValue(model, null), 2).ToString()
                    //        : propertyInfo.GetValue(model, null).ToString();

                    //    dataRow[propertyInfo.Name] = temp;
                    //}
                }
                dt.Rows.Add(dataRow);
            }
            return dt;
        }

        /// <summary>
        /// 根据实体类得到表结构
        /// </summary>
        /// <param name="model">实体类</param>
        /// <param name="nameList"></param>
        /// <returns></returns>
        private DataTable CreateData(T model, List<string> nameList)
        {
            DataTable dataTable = new DataTable(typeof(T).Name);
            foreach (string name in nameList)
            {
                string[] arr = name.Split(‘,‘);
                foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
                {
                    if (arr[0] == propertyInfo.Name)
                    {
                        //dataTable.Columns.Add(new DataColumn(propertyInfo.Name, propertyInfo.PropertyType));
                        dataTable.Columns.Add(new DataColumn(arr[1], propertyInfo.PropertyType));
                    }
                }
            }
            return dataTable;
        }
        #endregion
    }

}

调用:Mall.Config.ModelHandler<Bus_OnLine_Custom_Info> handler = new ModelHandler<Bus_OnLine_Custom_Info>();DataTable dt = handler.FillDataTable(online.busonline_list, list);
时间: 2024-10-29 19:11:17

datatable与实体相互转换 反射的相关文章

DataTable 转实体

因为Linq的查询功能很强大,所以从数据库中拿到的数据为了处理方便,我都会转换成实体集合List<T>. 开始用的是硬编码的方式,好理解,但通用性极低,下面是控件台中的代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace

Datatable和实体还有实体集List的区别与转化

机房收费系统大家想必不是做完,就是已经在手上了,在一开始做的时候就明确规定,我们必须用实体,而不能使Datatable,因为说是Datatable直接面向了数据库,当时不是很明白,于是也没有再深究,就去实现代码部分了,现在终于把三层的机房收费系统做完了,回过头再看的时候,有了那么一点小认识. 去年的时候,师哥师姐们用的是Datatable,也都实现了三层,在网上查了一些小Dome,也都是datatable ,于是我们就会发现这样真的有意义吗. 那么我们先来看看Datatable和Dataset吧

.net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类

在开发中可能会遇到这几种情况 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要先建一个类 ,头痛 4.如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类 为了解决上面的不便之处,我封装了一个实体生成类,可以扔到程序里面任意调用 封装类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

使用 AutoMapper 映射 IDataReader、DataSet、DataTable 到实体类

AutoMapper是一个.NET的对象映射工具. 项目地址:https://github.com/AutoMapper/AutoMapper. 帮助文档:https://github.com/AutoMapper/AutoMapper/wiki 主要用途 领域对象与DTO之间的转换.数据库查询结果映射至实体对象. 这里主要说下使用 AutoMapper 将 IDataReader.DataSet.DataTable 转为实体的方法. 依赖文件:AutoMapper.dll.AutoMapper

DataTable与实体类互相转换

/// <summary> /// DataTable与实体类互相转换 /// </summary> /// <typeparam name="T">实体类</typeparam> public class ModelHandler<T> where T : new() { #region DataTable转换成实体类 /// <summary> /// 填充对象列表:用DataSet的第一个表填充实体类 ///

DataTable转实体类

/// <summary> /// DataTable与实体类互相转换 /// </summary> /// <typeparam name="T">实体类</typeparam> public class ModelHandler<T> where T : new() { #region DataTable转换成实体类 /// <summary> /// 填充对象列表:用DataSet的第一个表填充实体类 ///

C# DataTable 转 实体类

C# 中查询结果DataTable转实体类: 比如:List<RtmInterview> rtmList = GetDataById( id); public List<RtmInterview> GetDataById(string id) { List<RtmInterview> rtmList = new List<RtmInterview>(); bool ConnectionOpenHere = false; try { DataTable dt

反射DataTable转实体类

1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Reflection; 5 6 namespace Dll 7 { 8 public static class ToEntity 9 { 10 /// <summary> 11 /// 将DataTable转换成实体类 12 /// </summary> 13 /// <typeparam name=&

Datatable和实体还有实体集List的差别与转化

机房收费系统大家想必不是做完.就是已经在手上了,在一開始做的时候就明白规定.我们必须用实体.而不能使Datatable,由于说是Datatable直接面向了数据库,当时不是非常明白,于是也没有再深究,就去实现代码部分了.如今最终把三层的机房收费系统做完了,回过头再看的时候,有了那么一点小认识. 去年的时候,师哥师姐们用的是Datatable.也都实现了三层.在网上查了一些小Dome.也都是datatable ,于是我们就会发现这样真的有意义吗. 那么我们先来看看Datatable和Dataset