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>();
}
点击直接下载类文件:
本文为博主原创,转载请保留出处:
http://www.chengchenxu.com/Article/10/