国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#實現DataTable映射成Model的方法(附源碼)

2020-01-24 01:21:43
字體:
來源:轉載
供稿:網友

本文實例講述了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#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 榆林市| 青冈县| 青铜峡市| 靖宇县| 永登县| 荣成市| 荔波县| 忻城县| 永嘉县| 香格里拉县| 泗阳县| 红原县| 南和县| 铜梁县| 纳雍县| 保山市| 楚雄市| 韶关市| 双鸭山市| 温宿县| 如东县| 沙坪坝区| 济源市| 杭锦旗| 开江县| 敖汉旗| 大冶市| 罗甸县| 盐池县| 霍山县| 新巴尔虎左旗| 张北县| 南华县| 隆回县| 博兴县| 滨海县| 天气| 仙游县| 太湖县| 商水县| 桃园市|