c# DataTable與不同結構實體類轉換的方法執行個體

來源:互聯網
上載者:User
在實際開發過程中,或者是第三方公司提供的資料表結構,與我們系統中的實體類欄位不對應,遇到這樣我們怎麼處理呢?可能有人會說,在轉換時建立一個實體物件,對錶裡的資料逐行遍曆來執行個體化這個實體物件不就完了。的確沒錯,這方法可行,但是這個方法效率極低,遇到億萬資料的話那就要執行個體化億萬個對象,由此可見它的效率了。
先看一下我的實體類

/// <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);}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.