DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

时间:2022-07-05 09:37:44

DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

 
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
/// <summary>
/// 类 说 明:给DataTable和DataRow扩展方法,直接转换为对象集合或对象
/// 编 码 人:程晨旭
/// 联系方式:Email:97391519@qq.com
///           Blog:http://www.chengchenxu.com
/// 修改日期:2018-02-28
/// 补充说明:此扩展类可以极大的简化操作,但是性能低下,大数据以及高性能要求下慎用.
///           此类如果放到asp.net的App_Code文件夹下会有编译错误,放到其他地方则无此问题
/// </summary>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Reflection;

namespace ChengChenXu.DataTableExtensions
{

    public static class DataTableExtensions
    {
        /// <summary>
        /// 把DataRow直接转换成对应的实体对象,给DataRow添加一个扩展方法,方便使用.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dr"></param>
        /// <returns></returns>
        public static T ToModel<T>(this DataRow dr)
        {
            T t = Activator.CreateInstance<T>();
            // 利用反射获得此模型的公共属性
            string attributeName = String.Empty;
            PropertyInfo[] propertys = t.GetType().GetProperties();
            foreach (PropertyInfo pi in propertys)
            {
                attributeName = pi.Name;
                // 检查DataTable是否包含此列
                //此处要求DataRow的列名称要和对象属性名称一致
                //注意:此处大小写不敏感
                if (dr.Table.Columns.Contains(attributeName))
                {
                    // 判断此属性是否为只读(不包含set构造)
                    if (!pi.CanWrite) { continue; }

                    //给属性赋值
                    var value = dr[attributeName];
                    if (value != DBNull.Value)
                    {
                        pi.SetValue(t, value, null);
                    }
                }
            }
            return t;
        }

        /// <summary>
        /// 将DataTable直接转化为对象集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static List<T> ToModelList<T>(this DataTable dt)
        {
            List<T> list = new List<T>();

            //调用ToModel方法添加List
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                T t = Activator.CreateInstance<T>();
                t = dt.Rows[i].ToModel<T>();
                list.Add(t);
            }

            return list;
        }
    }
}

使用方法:直接引用命名空间之后可以直接使用该方法

        public List<LinkModel> GetLinkList()
        {
            DataTable dt = SqlServerHelper.ExecuteDataTable("select * from MVC_Link order by showOrder ASC ");

            return dt.ToModelList<LinkModel>();
        }

        public LinkModel GetLink(int id)
        {
            string sql = "select * from MVC_Link where id = @id";
            SqlParameter[] parameters = SqlServerHelper.CreatParameters(
                new string[] { "id" },
                new object[] { id }
                );

            DataTable dt = SqlServerHelper.ExecuteDataTable(sql, parameters);
        if(dt.Rows.Count==0) return Null;        else return dt.Rows[0].ToModel<LinkModel>();
        }
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

点击直接下载类文件:

DataTable和DataRow利用反射直接转换为Model对象的扩展方法类DataTableExtensions.rar

本文为博主原创,转载请保留出处:
http://www.chengchenxu.com/Article/10/