当前位置: 移动技术网 > IT编程>开发语言>c# > c# DataTable与不同结构实体类转换的方法实例

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实

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

复制代码 代码如下:

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网