ORM中去除反射,添加Expression

之前接触了别人的ORM框架,感觉牛掰到不行,然后试着自己来写自己的ORM。

最初从园子里找到其他人写的反射的例子:

 1     List<PropertyInfo> pis = typeof(T).GetProperties().ToList<PropertyInfo>()
 2     while (dr.Read())
 3      {
 4        T model = Activator.CreateInstance<T>();
 5
 6         foreach (PropertyInfo propertyInfo in pis)
 7         {
 8          propertyInfo.SetValue(model,dr[propertyInfo.Name], null);
 9          }
10            list.Add(model);
11        }

基本满足需求,但是性能和Dapper相比,完全被打趴下了啊。
         偶然发现了Expression,好吧,不试怎么知道好用?

 1         public Action<T, IDataRecord> SetValueToEntity<T>(int index, string ProPertyName, Type FieldType)
 2         {
 3             Type datareader = typeof(IDataRecord);
 4             //获取调用方法
 5             System.Reflection.MethodInfo Method = GetMethod(FieldType, datareader);
 6             ParameterExpression e = Expression.Parameter(typeof(T), "e");
 7             ParameterExpression r = Expression.Parameter(datareader, "r");
 8             //常数表达式
 9             ConstantExpression i = Expression.Constant(index);
10             MemberExpression ep = Expression.PropertyOrField(e, ProPertyName);
11             MethodCallExpression call = Expression.Call(r, Method, i);
12             BinaryExpression assignExpression = Expression.Assign(ep, call);
13             Expression<Action<T, IDataRecord>> resultEx = Expression.Lambda<Action<T, IDataRecord>>(assignExpression, e, r);
14             Action<T, IDataRecord> result = resultEx.Compile();
15             return result;
16         }
17
18         public static MethodInfo GetMethod(Type FieldType, Type datareader)
19         {
20             switch (FieldType.FullName)
21             {
22                 case "System.Int16":
23                     return datareader.GetMethod("GetInt16");
24
25                 case "System.Int32":
26                     return datareader.GetMethod("GetInt32");
27
28                 case "System.Int64":
29                     return datareader.GetMethod("GetInt64");
30
31                 case "Double":
32                     return datareader.GetMethod("GetDouble");
33
34                 case "System.String":
35                     return datareader.GetMethod("GetString");
36
37                 case "Boolean":
38                     return datareader.GetMethod("GetBoolean");
39
40                 case "Char":
41                     return datareader.GetMethod("GetChar");
42
43                 case "System.Guid":
44                     return datareader.GetMethod("GetGuid");
45
46                 case "Single":
47                     return datareader.GetMethod("GetFloat");
48
49                 case "Decimal":
50                     return datareader.GetMethod("GetDecimal");
51
52                 case "System.DateTime":
53                     return datareader.GetMethod("GetDateTime");
54                 case "System.":
55                     return datareader.GetMethod("GetDateTime");
56             }
57             return null;
58         }
59
60  List<Action<T, IDataReader>> actionDics = new List<Action<T, IDataReader>>();
61             //数据实体类型
62             var perDic = typeof(T).GetProperties().ToDictionary(p => p.Name);
63             //生成表头
64             for (int i = 0; i < dr.FieldCount; i++)
65             {
66                 //获取列名
67                 string colName = dr.GetName(i);
68                 Type DataType = dr.GetFieldType(i);
69                 if (perDic.ContainsKey(colName))
70                 {
71                     actionDics.Add(SetValueToEntity<T>(i, colName, DataType));
72                 }
73             }
74             while (dr.Read())
75             {
76                 T objT = Activator.CreateInstance<T>();
77                 //填充属性值
78                 actionDics.ForEach(p => p.Invoke(objT, dr));
79                 list.Add(objT);
80             }

结果还是很可人滴,和Dapper不相上下。

下篇希望可以实现增、删、改。希望园友提供下建议。

时间: 2024-11-05 21:56:21

ORM中去除反射,添加Expression的相关文章

C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

反射以及Attribute在ORM中的应用 一. 反射什么是反射?简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等.反射有什么用呢?反射不但让你在运行是获取对象的信息,还提供运行时动态调用对象方法以及动态设置.获取属性等的能力.反射在ORM中有什么用呢?我这里所讨论的ORM实现是通过自定义Attribute的方式进行映射规则的描述的.但是我们并不知道具体哪个对象需要对应哪个表,并且这些对象是独立于我们的ORM框架的,所以我们只能通过自定义Attr

反射以及Attribute在ORM中的应用

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=488 反射以及Attribute在ORM中的应用一. 反射什么是反射?简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等.反射有什么用呢?反射不但让你在运行是获取对象的信息,还提供运行时动态调用对象方法以及动态设置.获取属性等的能力.反射在

ckeditor编辑器中去除p标签

ckeditor中默认添加p标签.去掉<p>标签的方法在ckeditor文件下config.js中加: config.shiftEnterMode = CKEDITOR.ENTER_P; 如果你想在ckeditor编辑的时候把回车换成<br/>标签,加: config.enterMode = CKEDITOR.ENTER_BR; 如果你想把编辑器设置为源码模式,加: config.startupMode = 'source'; ckeditor编辑器中去除p标签,布布扣,bubuk

详解C#中的反射

反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不知说得是否准确^_^).2.地球内部结构:地球的内部结构大体可以分为三层:地壳.地幔和地核.地壳是固体,地核是液体,地幔

android studio 中去除应用标题栏

android studio 中去除应用标题栏 ㈠ ⒈ mainifests中设置: android:theme="@style/AppTheme"(即默认设置). ⒉ values->styles.xml中设置: style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar". ㈡ values->styles.xml中: 在当先使用的style的parent属性添加

[Django]orm中的外键级联删除

这里的系统环境为django1.6   os为win7 今天有个需求说的是添加一个地区表,然后用外键和几个非常重要的实体表来做关联(地区表作为其他表的外键),写完地区的删除操作的时候,测试了下代码,功能正常.可是眼睛移动到控制台输出的时候傻了 connexesql ->DELETE FROM `mngm_device` WHERE `mngm_device`.`area_id` IN (%s, %s, %s) connexesql ->DELETE FROM `ad_ad` WHERE `ad

【转】详解C#中的反射

原帖链接点这里:详解C#中的反射 反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不知说得是否准确^_^). 2.地球内部结构:地球的内部结构大体可以分为三层:地壳.地

关于JAVA中的反射机制的总结

JAVA中的反射机制是一种能够大大增强程序扩展性的技术.当一个程序封装完成后(生成exe文件),如果想要对该程序进行功能扩展,不用进行代码的从新修改(也不可能拿到源码),只要修改配置文件(一般是XML)就可以完成. 这样的程序为外部提供了一个接口,只要按照该接口的规则定义一个对象(功能),即可以为应用程序扩展该功能. 可以这样比喻,你买了一块电脑主板(封装好的程序),此时你想要添加一块声卡(要扩展的功能),此时只能够通过一个pci接口(应用程序提供的接口)来进行扩展.声卡的接口必须符合PCI的规

.Net 中的反射(序章) - Part.1

引言 反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它,但对反射的使用作以初步了解在日后的开发中或许会有所帮助. 反射是一个庞大的话题,牵扯到的知识点也很多,包括程序集.自定义特性.泛型等,想要完全掌握它非常不易.本文仅仅对反射做一个概要介绍,关于它更精深的内容,需要在实践中逐渐掌握.本文将分为下面几个部分介绍.Net中的反射: 序章,我将通过一个例子来引出反射,获得对反射的第一印象. 反射初步.Type类.反射普通类型.(修改中,近期发布..