最近在做的一個項目中,有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即可,不需要去修改對應的賦值語句,非常靈活。