DataTable转实体Model,DataRow转实体Model,Dat…
2018-06-17 22:13:21来源:未知 阅读 ()
前言,此方法利用反射将DataRow转成实体,由于反射性能不行,大家就看看就行了吧。
代码来啦
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; namespace WangSql.DBUtility { public class DataMapHelper { private enum ModelType { //值类型 Struct, Enum, //引用类型 String, Object, Else } private static ModelType GetModelType(Type modelType) { if (modelType.IsEnum)//值类型 { return ModelType.Enum; } if (modelType.IsValueType)//值类型 { return ModelType.Struct; } else if (modelType == typeof(string))//引用类型 特殊类型处理 { return ModelType.String; } else if (modelType == typeof(object))//引用类型 特殊类型处理 { return ModelType.Object; } else//引用类型 { return ModelType.Else; } } public static List<T> DataTableToList<T>(DataTable table) { List<T> list = new List<T>(); foreach (DataRow item in table.Rows) { list.Add(DataRowToModel<T>(item)); } return list; } public static T DataRowToModel<T>(DataRow row) { T model; Type type = typeof(T); ModelType modelType = GetModelType(type); switch (modelType) { case ModelType.Struct://值类型 { model = default(T); if (row[0] != null) model = (T)row[0]; } break; case ModelType.Enum://值类型 { model = default(T); if (row[0] != null) { Type fiType = row[0].GetType(); if (fiType == typeof(int)) { model = (T)row[0]; } else if (fiType == typeof(string)) { model = (T)Enum.Parse(typeof(T), row[0].ToString()); } } } break; case ModelType.String://引用类型 c#对string也当做值类型处理 { model = default(T); if (row[0] != null) model = (T)row[0]; } break; case ModelType.Object://引用类型 直接返回第一行第一列的值 { model = default(T); if (row[0] != null) model = (T)row[0]; } break; case ModelType.Else://引用类型 { model = System.Activator.CreateInstance<T>();//引用类型 必须对泛型实例化 #region MyRegion //获取model中的属性 PropertyInfo[] modelPropertyInfos = type.GetProperties(); //遍历model每一个属性并赋值DataRow对应的列 foreach (PropertyInfo pi in modelPropertyInfos) { //获取属性名称 String name = pi.Name; if (row.Table.Columns.Contains(name) && row[name] != null) { ModelType piType = GetModelType(pi.PropertyType); switch (piType) { case ModelType.Struct: { var value = Convert.ChangeType(row[name], pi.PropertyType); pi.SetValue(model, value, null); } break; case ModelType.Enum: { Type fiType = row[0].GetType(); if (fiType == typeof(int)) { pi.SetValue(model, row[name], null); } else if (fiType == typeof(string)) { var value = (T)Enum.Parse(typeof(T), row[name].ToString()); if (value != null) pi.SetValue(model, value, null); } } break; case ModelType.String: { var value = Convert.ChangeType(row[name], pi.PropertyType); pi.SetValue(model, value, null); } break; case ModelType.Object: { pi.SetValue(model, row[name], null); } break; case ModelType.Else: throw new Exception("不支持该类型转换"); default: throw new Exception("未知类型"); } } } #endregion } break; default: model = default(T); break; } return model; } } }
后话,
1.可以通过缓存提高下性能。
每次typeof(T)后,将其对象相关信息(泛型属性等)存储起来,下次从缓存读取。
2.对SetValue改进。
可以使用泛型委托对其赋值。
3.用Emit
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Django model 字段类型及选项解析 2019-07-24
- Form和ModelForm组件 2019-05-23
- django 使用框架下auth.models自带的User进行扩展增加字段 2019-05-10
- 进程 2019-04-20
- Django—Form、ModelForm 2019-04-20
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash