c# DataTable与不同结构实体类转换的方法实例

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

代码如下:

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

(0)

相关推荐

  • C#实现实体类和XML相互转换

    一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T>(T obj) { using (StringWriter sw = new StringWriter()) { Type t= obj.GetType(); XmlSerializer serializer = new XmlSerializer(obj.GetType()); serializer.

  • C# 面向对象的基本原则

    C#面向对象的基本原则 一.面向接口编成而不是实现 [Code to an interface rather than to an implementation.] 二.优先使用组合而非继承 [Favor Composition Over Inheritance.] 三.SRP: The single responsibility principle 单一职责 系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成.[Every object in your syste

  • C#判等对象是否相等的方法汇总

    本文以实例形式展示了C#判等对象是否相等的常用方法,非常实用,可供大家参考借鉴之用.具体分析如下: 一.判断相等的3个方法 1.实例方法 public virtual bool Equals(object obj) { return RuntimeHelpers.Equals(this, obj); } 2.比较值类型静态方法 public static bool Equals(object objA, object objB) { return ((objA == objB) || (((ob

  • 浅谈对c# 面向对象的理解

    一.了解面向对象 1.概念基本理解:1).一个个体可以看做是一个对象,例如:人这个个体: 2).有共同属性的一类作为一个个体,例如:学生.白领.农民工: 3).结构体是用户自定义的数据类型,可以定义不同数据类型的变量,结构体也是面向对象的核心: 2.基本特性: 1)封装:是隐藏信息的特性,具有"封装"意识,是掌握面向对象分析与设计技巧的关键. 最简单的理解:创建一个对象的整体,使对象的属性可以具有赋值.取值的功能,也就是对象中的变量可以赋值.取值.,是一种认为的抽象出来的对象的概念.

  • C#编程获取实体类属性名和值的方法示例

    本文实例讲述了C#编程获取实体类属性名和值的方法.分享给大家供大家参考,具体如下: 遍历获得一个实体类的所有属性名,以及该类的所有属性的值 //先定义一个类: public class User { public string name { get; set; } public string gender { get; set; } public string age { get; set; } } //实例化类,并给实列化对像的属性赋值: User u = new User(); u.name

  • C# DataTable 转换为 实体类对象实例

    复制代码 代码如下: public class User {         public int ID { get; set; }         public string Name { get; set; } } //对应数据库表: //User //字段:ID.Name 那么你也许需要编写将DataTable 转换为实体对象的方法,便利DataTable.Rows 获得并填充.. 下面是我写的一个通用方法,分享+记录,便于日后直接Copy ~ 复制代码 代码如下: private sta

  • c#对象反序列化与对象序列化示例详解

    1.对象序列化的介绍 (1).NET支持对象序列化的几种方式二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下.SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.XML

  • C#对象与XMl文件之间的相互转换

    C#提供三种序列化方式,分别为:1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于BinaryFormatter的方式需要实现ISerializable接口,而XmlSeriializ不需要实现对应的接口,可以直接序列化.在这里面我们主要采用XMlSerialize来实现对应的序列化操作进而实现对应的对象和XMl文件之间的转换关系. 在通过序列化实现对应的转换关系操作的功能时,我首先创建了D

  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

  • C#实现实体类与字符串互相转换的方法

    本文实例讲述了C#实现实体类与字符串互相转换的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Text; namespace PackDLL.Data.ConvertData { /// <summary> /// 实体类.字符串互相转换 /// </summary> public class PackReflectionEntity<T> { //

  • C#实现根据实体类自动创建数据库表

    .Net新手通常容易把属性(Property)跟特性(Attribute)搞混,其实这是两种不同的东西 属性指的类中封装的数据字段:而特性是对类.字段.方法和属性等元素标注的声明性信息 如下代码(Id.Name为User的属性,[DbKey]为Id的特性) /// <summary> /// 用户信息 /// </summary> public class User { [DbKey] public string Id { get; set; } public string Nam

随机推荐