怎樣簡單靈活地將DataTable中的數據賦值給model


        最近在做的一個項目中,有13個方法都需要用到同一種處理方式:通過SQL語句從數據庫獲取一條指定的數據,並將該數據中的每個值都賦值給一個model,再將這個model中的數據通過微信發送出去。每個方法都會從不同的表中獲取數據,需要處理的數據完全不同,因此也對應了13個不同的model。這些model中的每個屬性名稱是已經給定的,需要將它們post出去,使用微信給定的模板發送消息,因此每個屬性的名稱必須與微信提供的模板中一致。

 

        下面舉個簡單的例子來說明當前的情況:

        SQL Server中用來存放數據的其中一個表結構如下(實際的字段有十幾個):

create table memberinfo
(
    member_id          int,
    member_name        varchar(20),
    member_birthday    varchar(50)    
)
go

        需要傳給微信消息模板的其中一個參數model如下:

    /// <summary>
    /// 微信消息中的參數
    /// </summary>
    public class wechatouputpara
    {
        private String _name = "";
        /// <summary>
        /// 會員姓名
        /// </summary>
        public String name 
        {
            get { return _name ; }
            set { _name = value; }
        }

        private String _birthday= "";
        /// <summary>
        /// 會員生日
        /// </summary>
        public String birthday
        {
            get { return _birthday; }
            set { _birthday= value; }
        }
    }

        需要達到的最終效果:將數據庫memberinfo表中的一條會員信息獲取出來,並將姓名member_name賦值給wechatouputpara類的name屬性,將生日member_birthday賦值給birthday屬性。

        注意:這里只是舉了一個簡單的例子,實際並不是把某個表中的字段直接轉換成某個類的,而是要通過存儲過程,將多個表聯合查詢出的結果進行轉換的,並且查詢的語句可能比較復雜。這個例子只是為了說明,一個已經存到DataTable里的數據,如何賦值給指定類中的同名屬性,僅此而已。

        既然有很多方法都需要用同一種方式處理,那么自然而然要想到有沒有一種能夠公用的方法,一勞永逸。畢竟每個表的結構是不同的,傳回的數據可能多達十幾二十幾個字段,如果每個方法中,都要將表中每個字段的值依次賦值給model中的對應屬性,那么工作量和代碼量都會非常大。

 

        我的解決辦法如下:

(1)通過SQL語句從表中獲取數據時,將每個字段轉換為與model中的對應屬性相同的名稱。

(2)寫一個方法,能夠將DataTable表中的每一個字段賦值給model中與其名稱相同的屬性。

(3)使用泛型,將這個方法作為一個公用方法,每個數據表向對應model中賦值時,都可以調用這個方法。

 

        接下來,仍然使用上面列出的簡單例子,來說明最終的解決方案。

(1)使用SQL語句獲取數據:

select member_name as [name],member_birthday as birthday from memberinfo where member_id = 1

        在代碼中,獲取到的數據被存到DataTable dtInfo中。

(2)寫一個公用方法,實現:將DataTable表中的每一個字段賦值給model中與其名稱相同的屬性。

        /// <summary>
        /// 將DataTable中的每一列賦值給model中的同名屬性
        /// DataTable中只有一行數據
        /// </summary>
        /// <typeparam name="T">泛型:model的類型</typeparam>
        /// <param name="objmodel">model的實例</param>
        /// <param name="dtInfo">DataTable表</param>
        public void TableToModel<T>(T objmodel, DataTable dtInfo)
        {
            //獲取model的類型
            Type modelType = typeof(T);

            //獲取model中的屬性
            PropertyInfo[] modelpropertys = modelType.GetProperties();

            //遍歷DataTable的每一列
            for (Int32 i = 0; i < dtInfo.Columns.Count; i++)
            {
                //遍歷model的每一個屬性
                foreach (PropertyInfo pi in modelpropertys)
                {
                    String name = pi.Name;  //獲取屬性名稱
                    //若model屬性名稱與表中的列名相同
                    if (name == dtInfo.Columns[i].ColumnName)
                    {
                        //獲取表中該列對應的數據
                        object value = dtInfo.Rows[0][i].ToString();
                        //將表中該列下的數據賦值給model中的同名屬性
                        modelType.GetProperty(name).SetValue(objmodel, value, null);
                    }
                }
            }
        }

(3)在代碼中調用公用方法,將DataTable dtInfo中的數據賦值給wechatouputpara類。

//輸出參數
wechatouputpara objwechatouputpara = new wechatouputpara();

//將會員信息賦值給輸出參數
TableToModel<wechatouputpara>(objwechatouputpara, dtInfo);

       

        問題解決了,13個類似的方法都可以直接一句話調用這個公用方法,就可以完成賦值操作,是不是簡單多了呢?並且,如果數據表的結構發生變化,或者微信消息需要添加、刪除參數,只需要修改SQL語句和對應的model即可,不需要去修改對應的賦值語句,非常靈活。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM