原文地址:http://www.cnblogs.com/kinger906/p/3428855.html

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

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

先看一下我的实体类

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

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

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[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;
    }
}

调用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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/fcsh820/p/3438483.html

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

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

    在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了.的 ...

  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. java实现验证码功能
  2. 深度学习框架哪家强?国产框架OneFlow做了一份测评报告
  3. [JVM-1]Java运行时数据区域
  4. 韩寒:出了国才知道,外国是多么的落后(写的真委婉~不愧是韩寒)
  5. python元类的简单了解
  6. 乐鑫代理-启明云端分享ESP32系列教程之二:Linux搭建esp-idf环境
  7. Linux 对应ARP欺骗的一种被动方法[转]
  8. kite 使用 go_使用Apache Storm和Kite SDK Morphlines的可配置ETL处理
  9. 电脑微信扫一扫在哪_怎么进入和管理企业微信的后台?
  10. 青海大学计算机考研调剂,青海大学2020年硕士研究生招生调剂公告
  11. LaTeX的常用命令
  12. atmega328 48手动解锁 擦除
  13. 开发3dMax插件的方法和应用
  14. 关于公司备份软件选型
  15. 以一例教你找到【无水印】【高清】【百度图片】的url
  16. docker 问题集
  17. 简要讨论python在拼多多关键字搜索、商品详情API接口做好电商选品的作用
  18. Epicor BPM - 在VS中编写BPM代码
  19. echarts map 地图做出立体效果 | 简单的解
  20. 抖音上很火的H53D立体动态相册效果

热门文章

  1. 前几年系列3:无间道2(由人物到剧情)
  2. 计算机模拟图像和数字,图像与数字图像基础
  3. 长安大学计算机专业考研科目,长安大学《计算机类学科基础》2021年硕士研究生初试考试内容范围及参考书目...
  4. CCProxy代理上网设置方法
  5. 多目标跟踪MOT16_Benchmark数据集下载-------------送人玫瑰,手留余香
  6. 帮宝宝睡得更好、更平稳
  7. 深度学习准备之Ubuntu下装显卡驱动
  8. 【Flutter】二十五、Flutter的事件处理
  9. springBoot使用activeMQ发送消息,错误This class is not trusted to be serialized as ObjectMessage payload.
  10. 游戏中的优化指的是什么?