亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

DataTable數據賦值給Model通用方法

2019-11-14 14:21:03
字體:
來源:轉載
供稿:網友

注:該文屬本人原創,今后項目中發現該方法存在BUG會實時更新,轉載記得附上原文出處,方便大家獲得最新代碼。

相信大家在做項目中,經常會根據不同的表new各種不同的Model,當需要對Model進行實例化的時候,先將數據從數據庫取出,將該數據中的每個值都賦值給一個model,假如你有10個Model,每次都會從不同的表中獲取數據,需要處理的數據完全不同,那么就要寫10個方法,對著10個Model進行賦值。編碼效率又低又low。為提高代碼通用性,故寫了個通用方法,實現datatable賦值model。

表結構(只是為了做演示,故沒有對表中列屬性進行相關設置,默認都允許為null):

CREATE TABLE [AddressInfo](    [Name] [NVARCHAR](20) NULL,    [Sex] [NVARCHAR](2) NULL,    [Address] [NVARCHAR](50) NULL,    [Age] [INT] NULL,    [Birthday] [DATE] NULL) 

Model類:

 1 public class AddressInfoModel 2     { 3  4         /// <summary> 5         /// 姓名 6         /// </summary> 7         public string Name { get; set; } 8         /// <summary> 9         /// 性別10         /// </summary>11         public string Sex { get; set; }12         /// <summary>13         /// 地址14         /// </summary>15         public string Address { get; set; }16         /// <summary>17         /// 年齡18         /// </summary>19         public int? Age { get; set; }20         /// <summary>21         /// 生日22         /// </summary>23         public DateTime? Birthday { get; set; }24 25     }

通常我們得到Model實體是這樣進行的

 1         /// <summary>   2         /// 得到一個對象實體 3         /// </summary> 4         public AddressInfo DataRowToModel(DataRow row) 5         { 6             Maticsoft.Model.addressinfo model=new Maticsoft.Model.addressinfo(); 7             if (row != null) 8             { 9                 if(row["id"]!=null && row["id"].ToString()!="")10                 {11                     model.id=int.Parse(row["id"].ToString());12                 }13                 if(row["name"]!=null)14                 {15                     model.name=row["name"].ToString();16                 }17                 if(row["Sex"]!=null)18                 {19                     model.Sex=row["Sex"].ToString();20                 }21                 if(row["Address"]!=null)22                 {23                     model.Address=row["Address"].ToString();24                 }25                 if(row["Age"]!=null && row["Age"].ToString()!="")26                 {27                     model.Age=int.Parse(row["Age"].ToString());28                 }29                 if(row["Birthday"]!=null && row["Birthday"].ToString()!="")30                 {31                     model.Birthday=DateTime.Parse(row["Birthday"].ToString());32                 }33             }34             return model;35         }36      

相信這是大家常用的方法,該方法的好處是簡單,容易理解,但是這樣寫會存在一個弊端,那就是方法通用性極差,甚至根本就沒有通用性,而且日后也不易維護。

試想一下:

(1)如果我們有100個Model需要賦值,按照這樣來做,我們豈不是需要寫100個這樣的方法來進行Model的賦值?

(2)一旦其中Model屬性發生改變,那么對應的方法也必須發生相應的修改,如果客戶不斷提出改變要對Model屬性進行修改,那工作量豈不是很大?

天哪!這工作量簡直不敢想象。

通過對上面的思考,我們不難發現,不管有多少個Model其實在對其進行賦值時,所進行的邏輯處理都是有規律的重復性的工作,即將DataRow中的列賦值給對應Model屬性。

經過一番努力終于通用方法第一個版本出爐(廢話不多說直接上干貨?。?/span>

(1)DataRow賦值Model通用方法之版本一:(該方法淘汰,僅為大家提供思路)

 1         /// <summary> 2         /// 將DataRow中數據賦值給model中的同名屬性 3         /// </summary> 4         /// <typeparam name="T">泛型:model的類型</typeparam> 5         /// <param name="objmodel">model的實例</param> 6         /// <param name="dtRow">DataRow</param> 7         public T TableToModel<T>(T objmodel, DataRow dtRow) 8         { 9             //獲取model的類型10             Type modelType = typeof(T);11             //獲取model中的屬性12             PRopertyInfo[] modelpropertys = modelType.GetProperties();13             //遍歷DataTable的每一列14             //遍歷model的每一個屬性15             foreach (PropertyInfo pi in modelpropertys)16             {17                 //獲取屬性名稱18                 String name = pi.Name;19                 //將DataRow中數據賦值給model中的同名屬性(不區分屬性名稱大小寫name和Name效果一樣)20                 if (dtRow.Table.Columns.Contains(name)) 21                 {22                     object value = dtRow[name].ToString();23                     pi.SetValue(objmodel, value, null);24                 }25             }26         }

通過測試發現,該方法對于Model屬性都是string類型的沒有問題,該Model中Age為Int類型,Birthday為DateTime類型,會發生類型不能匹配的錯誤,故通用性極差。在此基礎上出現了通用版本二

(2)DataRow賦值Model通用方法之版本二:(該方法淘汰,僅為大家提供思路)

將22行代碼
22 object value = dtRow[name].ToString();
修改為
object value = Convert.ChangeType(dtRow[name], modelType.GetProperty(name).PropertyType);
解決DataRow類型與Model類型不匹配問題

此時,該方法已經很好的通用性,著實高興了一下,但是當測試中,數據庫中自讀允許為null的情況下,該方法便不能適應復雜多變的Model賦值。例如該類中年齡和出生年月字段是允許為空的
即 int? Age 和DateTime? Birthday會報錯,不能將null值賦值給指定的數據類型,因為進一步改進該方法,最終版本如下:

(3)DataRow賦值Model通用方法之最終版:
 1         /// <summary> 2         /// 將DataRow賦值給model中同名屬性 3         /// </summary> 4         /// <typeparam name="T">泛型:model的類型</typeparam> 5         /// <param name="objmodel">model實例</param> 6         /// <param name="dtRow">DataTable行數據</param> 7         public T TableRowToModel<T>(T objmodel, DataRow dtRow) 8         { 9             //獲取model的類型10             Type modelType = typeof(T);11             //獲取model中的屬性12             PropertyInfo[] modelpropertys = modelType.GetProperties();13             //遍歷model每一個屬性并賦值DataRow對應的列14             foreach (PropertyInfo pi in modelpropertys)15             {16                 //獲取屬性名稱17                 String name = pi.Name;18                 if (dtRow.Table.Columns.Contains(name))19                 {20                     //非泛型21                     if (!pi.PropertyType.IsGenericType)22                     {23                         pi.SetValue(objmodel, string.IsNullOrEmpty(dtRow[name].ToString()) ? null : Convert.ChangeType(dtRow[name], pi.PropertyType), null);24                     }25                     //泛型Nullable<>26                     else27                     {28                         Type genericTypeDefinition = pi.PropertyType.GetGenericTypeDefinition();29                         //model屬性是可為null類型,進行賦null值30                         if (genericTypeDefinition == typeof(Nullable<>))31                         {32                            //返回指定可以為 null 的類型的基礎類型參數33                            pi.SetValue(objmodel, string.IsNullOrEmpty(dtRow[name].ToString()) ? null : Convert.ChangeType(dtRow[name], Nullable.GetUnderlyingType(pi.PropertyType)), null);34                         }35                     }36                 }37             }38             return objmodel;39         }
最終實現DataRow數據賦值給Model

通過該方法便可簡單實現將DataTable賦值給List<Model>!!(此處便不再給大家演示)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美人与物videos| 国产日韩欧美电影在线观看| 日本sm极度另类视频| 亚洲国产精彩中文乱码av| 日韩成人在线免费观看| 中文字幕欧美精品在线| 影音先锋欧美在线资源| 国产99久久久欧美黑人| 欧美成人精品h版在线观看| 成人在线免费观看视视频| 91久久精品美女| 日韩免费在线看| 欧美精品免费播放| 中文.日本.精品| 97香蕉久久夜色精品国产| 国产精品2018| 欧美性生活大片免费观看网址| 色偷偷噜噜噜亚洲男人| 久久久成人精品| 久久久久久久999| 久久久av免费| 亚洲国产婷婷香蕉久久久久久| 久久精品99久久久久久久久| 4438全国亚洲精品在线观看视频| 国产亚洲人成a一在线v站| 久久久久久久91| 亚洲自拍偷拍在线| 欧美性猛交xxxxx水多| 欧美国产日韩免费| 国产精品视频永久免费播放| 国产一区欧美二区三区| 国产亚洲精品久久久优势| 亚洲成人久久网| 精品呦交小u女在线| 国产精品日韩精品| 欧美日韩午夜视频在线观看| 亚洲一区二区三区成人在线视频精品| 国产97在线亚洲| 日韩美女写真福利在线观看| 九九热最新视频//这里只有精品| 久久伊人色综合| 国产在线视频欧美| 中文字幕综合在线| 亚洲一区精品电影| 中文字幕国产精品久久| 欧美高清自拍一区| 这里只有精品在线播放| 亚洲国产日韩欧美在线图片| 欧美电影在线观看完整版| 精品视频—区二区三区免费| 在线日韩av观看| 久久久久久久久91| 色悠悠久久久久| 91精品国产91久久久久| 成人免费福利视频| 国产精品久久久久久亚洲调教| 欧美网站在线观看| 亚洲色图15p| 久久影院免费观看| 亚洲激情电影中文字幕| 亚洲视频999| 国产精品美女无圣光视频| 亚洲精品综合精品自拍| 日韩成人av一区| 国产精品美女999| 久久久伊人日本| 高清欧美性猛交xxxx黑人猛交| 国产日本欧美一区二区三区在线| 国产精品欧美一区二区| 亚洲综合一区二区不卡| 亚洲成人黄色在线观看| 2018国产精品视频| 欧美一级片免费在线| 性欧美暴力猛交69hd| 亚洲欧洲在线免费| 亚洲欧美成人在线| 亚洲免费精彩视频| 亚洲午夜久久久影院| 日韩精品中文字幕有码专区| 欧美性生交大片免网| 动漫精品一区二区| 久久91亚洲精品中文字幕| 久久免费少妇高潮久久精品99| 日韩av在线免播放器| 亚洲国产精品推荐| 久久夜色精品国产欧美乱| 91久久精品在线| 欧美日韩精品二区| 日韩在线中文字| 性色av一区二区三区在线观看| 国产一区二区三区直播精品电影| www.xxxx精品| 亚洲国产精品推荐| 日韩av在线免费看| 久久不射电影网| 在线播放国产一区二区三区| 免费91麻豆精品国产自产在线观看| 亚洲白拍色综合图区| 福利一区福利二区微拍刺激| 欧洲成人在线视频| 亚洲成人黄色网址| 在线视频亚洲欧美| 久久久精品一区| 国产精品99久久久久久人| 久久精品中文字幕免费mv| 欧美精品999| 亚洲伊人一本大道中文字幕| 亚洲国产中文字幕在线观看| 亚洲国产精品va在线| 国产欧美一区二区| 国产精品成av人在线视午夜片| 亚洲影院色在线观看免费| 成人激情在线播放| 中文字幕久久久av一区| 欧美激情第一页xxx| 欧美极品少妇xxxxx| 亚洲色在线视频| 欧美激情免费看| 久久艳片www.17c.com| 91精品国产一区| 欧美精品在线观看91| 国产精品v片在线观看不卡| 在线观看中文字幕亚洲| 精品亚洲永久免费精品| 成人网在线免费观看| 亚洲视频在线看| 久久91亚洲精品中文字幕奶水| 久久久人成影片一区二区三区观看| 午夜精品一区二区三区视频免费看| 国产香蕉精品视频一区二区三区| 九九精品视频在线| 欧美亚洲国产另类| 97久久精品人搡人人玩| 久久精品视频99| 国产精品自产拍在线观看| 中文字幕日韩欧美在线| 91久久精品视频| 97免费视频在线播放| 国产成人精品日本亚洲专区61| 一区二区成人精品| 亚洲成色777777女色窝| 国产91精品网站| 亚洲男人天堂网| 亚洲夜晚福利在线观看| 国产精品免费久久久久影院| 中文字幕久热精品视频在线| 日韩av免费网站| 国产精品国产亚洲伊人久久| 日韩中文在线视频| 91九色国产社区在线观看| 午夜精品在线视频| 精品久久久久久国产| 久久综合电影一区| 亚洲影院色在线观看免费| 日韩av日韩在线观看| 成人免费淫片aa视频免费| 久久99精品久久久久久青青91| 欧美精品一区二区免费| 欧美第一淫aaasss性| 久久青草精品视频免费观看| 色悠悠久久久久| 国产一区二区三区在线免费观看| 欧美午夜宅男影院在线观看| 精品二区三区线观看|