C#实现DataTable映射成Model的方法(附源码)
程序员文章站
2022-03-21 13:57:48
本文实例讲述了c#实现datatable映射成model的方法。分享给大家供大家参考,具体如下:
这是数据库开发中经常遇到的问题,当然,这可以用现成的orm框架来解决,但...
本文实例讲述了c#实现datatable映射成model的方法。分享给大家供大家参考,具体如下:
这是数据库开发中经常遇到的问题,当然,这可以用现成的orm框架来解决,但有些时候,如果dataset/datatable是第三方接口返回的,orm就不方便了,还得自己处理。
反射自然必不可少的,另外考虑到datatable中的columnname通常与model的propertyname并不严格对应,可以用attribute来记录这种映射关系。
步骤1:先创建一个datafieldattribute类
using system; namespace jimmy.orm { [attributeusage(attributetargets.property)] public sealed class datafieldattribute:attribute { /// <summary> /// 表对应的字段名 /// </summary> public string columnname { set; get; } public datafieldattribute(string columnname) { columnname = columnname; } } }
步骤2:在model/entity的class成员上,应用datafield特性,参见下面的代码:
using system; namespace jimmy.orm.entity { [serializable] public class productentity : dataentitybase { [datafield("product_no")] public string productno { set; get; } [datafield("product_id")] public int productid { set; get; } [datafield("product_name")] public string productname { set; get; } public override string tostring() { return string.format("productno:{1}{0}productid:{2}{0}productname:{3}", environment.newline, productno, productid, productname); } } }
步骤3:该反射出场了,为了方便起见,封装了一个dataconvert类
using system; using system.collections.generic; using system.data; using system.reflection; namespace jimmy.orm { /// <summary> /// 将datarow/datatable转换成entity/entity列表 /// </summary> public static class dataconvert<t> where t : dataentitybase, 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; } } }
步骤4:测试
using system; using system.data; using jimmy.orm.entity; namespace jimmy.orm.test { class program { static void main() { datatable dt = new datatable(); 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, "服装"); var products = dataconvert<productentity>.tolist(dt); foreach (var entity in products) { console.writeline(entity); } console.read(); } } }
完整实例代码代码点击此处本站下载。
希望本文所述对大家c#程序设计有所帮助。
下一篇: 轻松学习C#的密封类