博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射和特性 自定义转换datatable为强类型集合
阅读量:4620 次
发布时间:2019-06-09

本文共 4942 字,大约阅读时间需要 16 分钟。

 转换类:

View Code
public static class ListGenerater    {        //加入DataTable扩展方法        public static List
ConvertToList
(this DataTable dt) { Type type = typeof(T); var fieldBinding = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance; //得到数据库字段名和类名的映射关系 var mappings = type.GetProperties() .Where((item) => { var attrs = item.GetCustomAttributes(typeof(DBColumnAttribute), false); return attrs.Length > 0; }) .Select((item) => { var attr = item.GetCustomAttributes(typeof(DBColumnAttribute), false)[0] as DBColumnAttribute; var dbName=(string.IsNullOrEmpty(attr.DbName) ? item.Name : attr.DbName); var storage = string.IsNullOrEmpty(attr.Storage) ? null : type.GetField(attr.Storage, fieldBinding); return new { Type = item.PropertyType, DbName = dbName, Property = item, StorageField=storage }; }); //动态生成类,根据映射关系得到datatable里的数据,再赋值到类中 List
list = new List
(); foreach (DataRow row in dt.Rows) { T temp = Activator.CreateInstance
(); foreach (var mapping in mappings) { if (mapping.StorageField==null) { mapping.Property.SetValue(temp, row[mapping.DbName], null); } else { mapping.StorageField.SetValue(temp, row[mapping.DbName]); } } list.Add(temp); } return list; } } [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class DBColumnAttribute : Attribute { ///
/// 对应数据集中的字段名 /// public string DbName { get; set; } ///
/// 存储的字段,如果设置,会绕过属性存取器,直接对字段赋值 /// public string Storage { get; set; } }

测试代码:

View Code
class Program    {        static void Main(string[] args)        {            string constr = "Data Source=.;Initial Catalog=ShiShangDBx;Integrated Security=True";            string querystr = "select top(5) * from [User]";            SqlDataAdapter ada = new SqlDataAdapter(querystr, constr);            DataTable dt = new DataTable();            ada.Fill(dt);            var p = new Program();            p.TestDynamic(dt);            p.TestStatic(dt);                    }        public void TestDynamic(DataTable dt)        {            var watch = Stopwatch.StartNew();            watch.Start();            for (int i = 0; i < 10000; i++)            {                var userlist = dt.ConvertToList
(); } watch.Stop(); Console.WriteLine(watch.Elapsed); } public void TestStatic(DataTable dt) { var watch = Stopwatch.StartNew(); watch.Start(); for (int i = 0; i < 10000; i++) { var userlist = convert(dt); } watch.Stop(); Console.WriteLine(watch.Elapsed); } public List
convert(DataTable dt) { List
list = new List
(); foreach (DataRow row in dt.Rows) { var user = new UserInfo(row["ID"].ToString()) { IsAnonymous = bool.Parse(row["IsAnonymous"].ToString()), LastActiveDate = DateTime.Parse(row["LastActiveDate"].ToString()) }; } return list; } } public class UserInfo { [DBColumn(DbName = "ID", Storage = "_UserID")] public Guid UserID { get { return _UserID; } } [DBColumn] public bool IsAnonymous { get; set; } [DBColumn] public DateTime LastActiveDate { get; set; } private Guid _UserID; public UserInfo() { } public UserInfo(Guid userId) { _UserID = userId; } public UserInfo(string userId) { _UserID =Guid.Parse(userId); } }

动态反射转换和硬编码相比有虽然几倍的差距,不过对于数据交换不是很频繁的情况下,绝对时间差距还是不大的

使用这个辅助类,或者适当改造,就可以实现一般ORM的Query<T>的效果

转载于:https://www.cnblogs.com/FlyCat/archive/2012/07/28/2613205.html

你可能感兴趣的文章
用Winrar批量解压缩有密码文件方法,只需输入一次密码
查看>>
解惑好文:移动端H5页面高清多屏适配方案
查看>>
traefik添加多证书
查看>>
PhantomJs 笔记
查看>>
js设计模式--语言类型
查看>>
C#多线程之二:ManualResetEvent和AutoResetEvent
查看>>
忽略UserInterfaceState.xcuserstate
查看>>
ReactNative--Flexbox布局
查看>>
java实现读取文件大全
查看>>
[Cordova] 无法显示Alert视窗
查看>>
借助过度区选择阈值
查看>>
价格正则
查看>>
评论列表显示及排序,个人中心显示
查看>>
JavaWeb学习笔记总结 目录篇
查看>>
C#根据html生成PDF
查看>>
Neutron SDN 手动实现手册
查看>>
linux下core文件调试方法
查看>>
20个创意404错误页面设计的启示
查看>>
基础训练 芯片测试
查看>>
如何用命令将本地项目上传到git
查看>>