• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

c# 搞代码 4年前 (2022-01-09) 35次浏览 已收录 0个评论

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

/// <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.Colum<mark style="color:transparent">来4源gaodaimacom搞#代%码*网</mark>nName))                        {                            //根据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# DataTable与不同结构实体类转换的方法实例相关文章请关注搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:c# DataTable与不同结构实体类转换的方法实例
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址