C#实现DataTable映射成Model的方法(附源码)
本文实例讲述了C#实现DataTable映射成Model的方法。分享给大家供大家参考,具体如下:
这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理。
反射自然必不可少的,另外考虑到DataTable中的ColumnName通常与Model的PropertyName并不严格对应,可以用Attribute来记录这种映射关系。
步骤1:先创建一个DataFieldAttribute类
usingSystem; namespaceJimmy.ORM { [AttributeUsage(AttributeTargets.Property)] publicsealedclassDataFieldAttribute:Attribute { ///<summary> ///表对应的字段名 ///</summary> publicstringColumnName{set;get;} publicDataFieldAttribute(stringcolumnName) { ColumnName=columnName; } } }
步骤2:在Model/Entity的Class成员上,应用DataField特性,参见下面的代码:
usingSystem; namespaceJimmy.ORM.Entity { [Serializable] publicclassProductEntity:DataEntityBase { [DataField("PRODUCT_NO")] publicstringProductNo{set;get;} [DataField("PRODUCT_ID")] publicintProductId{set;get;} [DataField("PRODUCT_NAME")] publicstringProductName{set;get;} publicoverridestringToString() { returnstring.Format("ProductNo:{1}{0}ProductId:{2}{0}ProductName:{3}",Environment.NewLine,ProductNo, ProductId,ProductName); } } }
步骤3:该反射出场了,为了方便起见,封装了一个DataConvert类
usingSystem; usingSystem.Collections.Generic; usingSystem.Data; usingSystem.Reflection; namespaceJimmy.ORM { ///<summary> ///将DataRow/DataTable转换成Entity/Entity列表 ///</summary> publicstaticclassDataConvert<T>whereT:DataEntityBase,new() { ///<summary> ///将DataRow行转换成Entity ///</summary> ///<paramname="dr"></param> ///<returns></returns> publicstaticTToEntity(DataRowdr) { Tentity=newT(); Typeinfo=typeof(T); varmembers=info.GetMembers(); foreach(varmiinmembers) { if(mi.MemberType==MemberTypes.Property) { //读取属性上的DataField特性 object[]attributes=mi.GetCustomAttributes(typeof(DataFieldAttribute),true); foreach(varattrinattributes) { vardataFieldAttr=attrasDataFieldAttribute; if(dataFieldAttr!=null) { varpropInfo=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); } } } } } returnentity; } ///<summary> ///将DataTable转换成Entity列表 ///</summary> ///<paramname="dt"></param> ///<returns></returns> publicstaticList<T>ToList(DataTabledt) { List<T>list=newList<T>(dt.Rows.Count); foreach(DataRowdrindt.Rows) { list.Add(ToEntity(dr)); } returnlist; } } }
步骤4:测试
usingSystem; usingSystem.Data; usingJimmy.ORM.Entity; namespaceJimmy.ORM.Test { classProgram { staticvoidMain() { DataTabledt=newDataTable(); dt.Columns.Add("PRODUCT_NO"); dt.Columns.Add("PRODUCT_ID"); dt.Columns.Add("PRODUCT_NAME"); dt.Rows.Add("00001",1,"手机"); dt.Rows.Add("00002",2,"服装"); varproducts=DataConvert<ProductEntity>.ToList(dt); foreach(varentityinproducts) { Console.WriteLine(entity); } Console.Read(); } } }
完整实例代码代码点击此处本站下载。
希望本文所述对大家C#程序设计有所帮助。