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

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

先看一下我的实体类

/// <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);
}

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. CENTOS7配置静态IP后无法ping通外部网络的问题

    我今天想谈论的并不是如何配置静态IP,这样的话题已经有好多高手再谈. 我想谈的是为什么,我按照他们的教程无论如何也要发生各种问题,没办法连接外网的问题. 先给大家看我的最终版配置方案:我只修改了一个文 ...

  2. wordpress更换域名

    问题缘由 在群里面看到很多朋友问,wordpress要换域名这么办?后台的设置-常规里修改里域名后,全站打不开了,这是为什么?这么办? 问题解说 其实wordpress换域名需要到数据库进行操作的,首 ...

  3. spring mvc集成freemarker使用

    freemarker作为视图技术出现的比velocity早,想当年struts风靡一时,freemarker作为视图层也风光了一把.但现在velocity作为后起之秀的轻量级模板引擎,更容易得到青睐. ...

  4. 参数化防SQL注入

    private void AddStudent(){ string strName =txtName.Text.Trim(); string strPwd = txtPwd.Text.Trim(); ...

  5. Delphi单元文件之-简体繁体互转

    Function GBCht2Chs(GBStr: String): AnsiString; {GBK繁体转简体} Var   len:integer;   pGBCHTChar: PChar;   ...

  6. pmap命令 查看进程用了多少内存

    pmap命令   查看进程用了多少内存                                     用法       pmap [ -x | -d ] [ -q ] pids       ...

  7. python实现文件加密

    前言: 想实现批量文件加密,可惜批量.展时没有思路 0x1 没有加密前的图片 加密后!!! !!!打不开了 0x02: 代码 import hashlib def get_sha1(f): xd=op ...

  8. Android 4 学习(11):Intent简介

    参考<Professional Android 4 Development> Intents 本文主要从这几个方面介绍Intents: 使用Intents在Android程序内部或外部通信 ...

  9. Path expected for join!的解决办法

    Path expected for join! [SELECT count(*) FROM cn.com.jsoft.entities.TDSysnphoto p left join TDSysnot ...

  10. Uboot详细解析2

    1.第二阶段的主线函数位于u-boot-2010.06/arch/arm/lib/board.c. 第二阶段的功能: <1> 初始化本阶段要使用到的硬件设备. 设置时钟.初始化串口. bo ...