c# DataTable与不同结构实体类转换的方法实例
c# DataTable与不同结构实体类转换的方法实例
发布时间:2016-12-28 来源:查字典编辑
摘要:在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实...

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

先看一下我的实体类

复制代码 代码如下:

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

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C#教程学习
热门C#教程学习
编程开发子分类