c# DataTable与不同结构实体类转换的方法实例
程序员文章站
2024-02-21 20:44:46
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实...
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了。的确没错,这方法可行,但是这个方法效率极低,遇到亿万数据的话那就要实例化亿万个对象,由此可见它的效率了。
先看一下我的实体类
复制代码 代码如下:
/// <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);
}