在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了。的确没错,这方法可行,但是这个方法效率极低,遇到亿万数据的话那就要实例化亿万个对象,更要命的是还要对每个对象的字段逐一赋值,由此可见它的效率了。

今天我无意在网上看到了一大牛写的一段代码,让我很感慨,现在我将它记录下来,希望对以后开发过程中有所用。

先看一下我的实体类

/// <summary>
/// 具体的实体类,和数据表中不同
/// </summary>
public class Person
{[DataField("user_name")]//表示数据库表里面的字段public string UserName { set; get; }//表示需要转换成的字段[DataField("pass_word")]public string PassWord { set; get; }
}

具体在代码中有注释,下面是转换类

[AttributeUsage(AttributeTargets.Property)]
public sealed class DataFieldAttribute : Attribute
{/// <summary>/// 表对应的字段名/// </summary>public string ColumnName { set; get; }public DataFieldAttribute(string columnName){ColumnName = columnName;}
}public static class DataConvert<T> where T : new()
{/// <summary>/// 将DataRow行转换成Entity/// </summary>/// <param name="dr"></param>/// <returns></returns>public static T ToEntity(DataRow dr){T entity = new T();Type info = typeof(T);var members = info.GetMembers();foreach (var mi in members){if (mi.MemberType == MemberTypes.Property){//读取属性上的DataField特性object[] attributes = mi.GetCustomAttributes(typeof(DataFieldAttribute), true);foreach (var attr in attributes){var dataFieldAttr = attr as DataFieldAttribute;if (dataFieldAttr != null){var propInfo = info.GetProperty(mi.Name);if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName)){//根据ColumnName,将dr中的相对字段赋值给Entity属性propInfo.SetValue(entity,Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),null);}}}}}return entity;}/// <summary>/// 将DataTable转换成Entity列表/// </summary>/// <param name="dt"></param>/// <returns></returns>public static List<T> ToList(DataTable dt){List<T> list = new List<T>(dt.Rows.Count);foreach (DataRow dr in dt.Rows){list.Add(ToEntity(dr));}return list;}
}

调用代码:

DataTable dt = new DataTable();
dt.Columns.Add("user_name");
dt.Columns.Add("pass_word");//这是表中的字段,现在需要将它们转换为具体的实体类实例
dt.Rows.Add("kingtiger","1");
dt.Rows.Add("wangbiao", "2");var users = DataConvert<Person>.ToList(dt);
foreach (var user in users)
{Response.Write(user.UserName + "," + user.PassWord);
}for (int i = 0; i < dt.Rows.Count; i++)
{Person p = DataConvert<Person>.ToEntity(dt.Rows[i]);Response.Write(p.UserName + "," + p.PassWord);
}

转载于:https://www.cnblogs.com/kinger906/p/3428855.html

DataTable与结构不同实体类之间的转换相关推荐

  1. (转)DataTable与结构不同实体类之间的转换

    原文地址:http://www.cnblogs.com/kinger906/p/3428855.html 在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我 ...

  2. mysql 数据转换dataset_【转】dataset和实体类 之间的转换

    usingSystem; usingSystem.Collections.Generic; usingSystem.Data; usingSystem.Data.Common; usingSystem ...

  3. java entity转dto_java 使用反射在dto和entity 实体类之间进行转换

    public class Utils { /** * 将dto和entity之间的属性互相转换,dto中属性一般为String等基本类型, * 但是entity中可能有复合主键等复杂类型,需要注意同名 ...

  4. sql时间格式转换yyyymm_XML和实体类之间的转换

    言简意赅: 1.jar包的maven 坐标 <dependency> <groupId>com.thoughtworks.xstreamgroupId> <arti ...

  5. Java通过Fastjson实现JSONObject对象、Json字符串以及Java实体类之间互相转换

    导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</arti ...

  6. c语言xml序列化,C# XML和实体类之间相互转换(序列化和反序列化)

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...

  7. java xml 实体类_java中的xml与实体类之间的映射

    实体类: package xml; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class User ...

  8. Android JSON数据与实体类之间的相互转化-------GSON的简单用法

    Android JSON数据与实体类之间的相互转化-------GSON的用法 1_Gson的导入 1.1_方法一:直接导入jar包 1.2_方法二:引入依赖 2_json形式的字符串互转实体对象 2 ...

  9. C#利用反射将Datatable转化为指定实体类ListT

    背景介绍 在软件开发中肯定免不了和数据库打交道,我们对数据的增删改查最终会转化为SQL在数据库中执行.从SQLServer中查出数据一般有两种方式:一是ADO.NET直接写SQL语句从数据中查出数据, ...

最新文章

  1. R语言I绘制等高线图
  2. Linux命令学习-mv命令
  3. select 在各浏览器中显示option的测试结果分享
  4. 【2014-11-22】《The Hardware/Software Interface》– Section 5
  5. 第九届(2018)蓝桥杯 山东省赛解题报告(题目+分析+代码)
  6. 产品经理常犯的七大错误
  7. Java高级程序猿技术积累
  8. AJPFX解析关于编码ansi、GB2312、unicode与utf-8的区别
  9. matlab 实现行程编码 对二值图像进行编解码
  10. 28. Element nodeValue 属性
  11. Redis: 配置文件示例
  12. 计算机word的常用功能技巧,10个Word操作神技巧,看看你会多少?
  13. 使用MEAT在iOS设备上采集取证信息
  14. 腾讯会议共享屏幕 共享PPT视频声音
  15. QT Android wifi自动重连开发
  16. ZYNQ中DMA与AXI4总线-DMA简介
  17. Eclipse使用教程1
  18. 天地图卫星地图在OpenLayers中的应用示例源码
  19. Matlab矩阵论矩阵分析计算实现(四)求史密斯标准型和约当标准型
  20. 专业B2C电子商务平台推荐

热门文章

  1. AOJ0189 Convenient Location
  2. 硬件设计之一——电源设计03:LDO设计
  3. 【bzoj1217】[HNOI2003]消防局的设立 贪心
  4. Acute TravelLogic使用教程
  5. 怎么用vuex-along插件实现数据持久化
  6. 蓝桥杯-----世纪末的星期
  7. 高级架构师_Docker_第2章_ Docker核心原理_ 第2节_Docker网络
  8. 红帽企业版 8.0 安装
  9. Console调试常用用法
  10. 用ZXing 生成条形码和二维码图片