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

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

先看一下我的实体类

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

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

  1. [AttributeUsage(AttributeTargets.Property)]
  2. public sealed class DataFieldAttribute : Attribute
  3. {
  4. /// <summary>
  5. /// 表对应的字段名
  6. /// </summary>
  7. public string ColumnName { set; get; }
  8.  
  9. public DataFieldAttribute(string columnName)
  10. {
  11. ColumnName = columnName;
  12. }
  13. }
  14.  
  15. public static class DataConvert<T> where T : new()
  16. {
  17. /// <summary>
  18. /// 将DataRow行转换成Entity
  19. /// </summary>
  20. /// <param name="dr"></param>
  21. /// <returns></returns>
  22. public static T ToEntity(DataRow dr)
  23. {
  24. T entity = new T();
  25. Type info = typeof(T);
  26. var members = info.GetMembers();
  27. foreach (var mi in members)
  28. {
  29. if (mi.MemberType == MemberTypes.Property)
  30. {
  31. //读取属性上的DataField特性
  32. object[] attributes = mi.GetCustomAttributes(typeof(DataFieldAttribute), true);
  33. foreach (var attr in attributes)
  34. {
  35. var dataFieldAttr = attr as DataFieldAttribute;
  36. if (dataFieldAttr != null)
  37. {
  38. var propInfo = info.GetProperty(mi.Name);
  39. if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName))
  40. {
  41. //根据ColumnName,将dr中的相对字段赋值给Entity属性
  42. propInfo.SetValue(entity,
  43. Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),
  44. null);
  45. }
  46.  
  47. }
  48. }
  49. }
  50. }
  51. return entity;
  52. }
  53.  
  54. /// <summary>
  55. /// 将DataTable转换成Entity列表
  56. /// </summary>
  57. /// <param name="dt"></param>
  58. /// <returns></returns>
  59. public static List<T> ToList(DataTable dt)
  60. {
  61. List<T> list = new List<T>(dt.Rows.Count);
  62. foreach (DataRow dr in dt.Rows)
  63. {
  64. list.Add(ToEntity(dr));
  65. }
  66. return list;
  67. }
  68. }

调用代码:

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

DataTable与结构不同实体类之间的转换的更多相关文章

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

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

  2. DataTable和实体类之间的转换

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...

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

    package com.example.demo.utils; import java.lang.reflect.Method; import java.util.List; import com.e ...

  4. (转)DATATABLE(DATASET)与实体类之间的互转.

    转自:http://www.cnblogs.com/zzyyll2/archive/2010/07/20/1781649.html dataset和实体类 之间的转换 //dataset转实体类  代 ...

  5. DataReader,DataTable利用泛型填充实体类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...

  6. 实体类与实体DTO类之间的转换

    实体类与实体DTO类之间的转换 实体类与实体DTO类之间的转换 1.通过使用第三方序列化反序列化工具Newtonsoft.Json 2.通过反射实现 3.通过表达式目录树加字典缓存实现 4. 通过表达 ...

  7. XML文件与实体类的互相转换

    XML文件与实体类的互相转换 一.将XML文件反序列化为实体类对象 1. 通常程序的配置信息都保存在程序或者网站的专门的配置文件中(App.config/web.config).但是现在为了演示XML ...

  8. Java基本数据类型、包装类与String类之间的转换

    一.基本数据类型与包装类之间的转换: import org.junit.Test; public class MainTest { /** * 基本数据类型与包装类之间的转换 */ @Test pub ...

  9. C# 实现实体类和Xml转换

    一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T& ...

随机推荐

  1. Java 虚拟机-垃圾收集算法

    本文主要介绍Java虚拟机的垃圾回收算法. 一.概述 二.标记-清除算法 Mark-Sweep.如同名字,该算法分两步: 标记:标记处需要回收的对象 清除:标记完成后统一回收被标记的对象. 缺点: 效 ...

  2. 关于app集成支付宝应用内支付的问题总结

    pem文件生成,将合作伙伴密钥复制到notepad++中,每45个字符回车,去除空格,头尾加上标题,文件需保存为无BOM的UTF8格式,就OK.  可以每行64个字符,共216个字符.   近来处理了 ...

  3. javascript中原型学习

    学习地址:http://www.cnblogs.com/wangfupeng1988/tag/%E5%8E%9F%E5%9E%8B/

  4. Memcached数据存储方式

    1. memcached的数据存储方式被称为Slab Allocator,其基本方式是: ①:先把内存分成很多Slab,这个大小是预先规定好的,已解决内存碎片的问题.分配给Slab的内存空间被称为Pa ...

  5. Python时间日期函数讲解

    所有日期.时间的api都在datetime模块内. 1. 日期输出格式化 datetime => string import datetime now = datetime.datetime.n ...

  6. PHP判断当前协议是否为HTTPS

    function is_https() { if ( !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'o ...

  7. git commit 提交的时候,出现*** Please tell me who you are. git config --global 。。。问题

    $ git commit -a -m 'v6' *** Please tell me who you are. Run git config --global user.email "you ...

  8. leetcode696

    本题先寻找字符串中0变1,或者1变0的位置作为分隔位置.然后从这个分隔位置同时向左.右两侧搜索. 找到的左连续串和右连续串,都进行累计. public class Solution { public ...

  9. Java微信公众平台开发(十三)--微信JSSDK中Config配置

    转自:http://www.cuiyongzhi.com/post/57.html 前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端 ...

  10. 12-EasyNetQ之消息版本控制

    为了能够支持消息版本控制,你需要确保这个必要的组件已配置.最简单的实现是这样的: var bus = RabbitHutch.CreateBus("host=localhost", ...