ORM中去除反射,添加Expression
之前接触了别人的ORM框架,感觉牛掰到不行,然后试着自己来写自己的ORM。
最初从园子里找到其他人写的反射的例子:
List<PropertyInfo> pis = typeof(T).GetProperties().ToList<PropertyInfo>()
while (dr.Read())
{
T model = Activator.CreateInstance<T>(); foreach (PropertyInfo propertyInfo in pis)
{
propertyInfo.SetValue(model,dr[propertyInfo.Name], null);
}
list.Add(model);
}
基本满足需求,但是性能和Dapper相比,完全被打趴下了啊。
偶然发现了Expression,好吧,不试怎么知道好用?
public Action<T, IDataRecord> SetValueToEntity<T>(int index, string ProPertyName, Type FieldType)
{
Type datareader = typeof(IDataRecord);
//获取调用方法
System.Reflection.MethodInfo Method = GetMethod(FieldType, datareader);
ParameterExpression e = Expression.Parameter(typeof(T), "e");
ParameterExpression r = Expression.Parameter(datareader, "r");
//常数表达式
ConstantExpression i = Expression.Constant(index);
MemberExpression ep = Expression.PropertyOrField(e, ProPertyName);
MethodCallExpression call = Expression.Call(r, Method, i);
BinaryExpression assignExpression = Expression.Assign(ep, call);
Expression<Action<T, IDataRecord>> resultEx = Expression.Lambda<Action<T, IDataRecord>>(assignExpression, e, r);
Action<T, IDataRecord> result = resultEx.Compile();
return result;
} public static MethodInfo GetMethod(Type FieldType, Type datareader)
{
switch (FieldType.FullName)
{
case "System.Int16":
return datareader.GetMethod("GetInt16"); case "System.Int32":
return datareader.GetMethod("GetInt32"); case "System.Int64":
return datareader.GetMethod("GetInt64"); case "Double":
return datareader.GetMethod("GetDouble"); case "System.String":
return datareader.GetMethod("GetString"); case "Boolean":
return datareader.GetMethod("GetBoolean"); case "Char":
return datareader.GetMethod("GetChar"); case "System.Guid":
return datareader.GetMethod("GetGuid"); case "Single":
return datareader.GetMethod("GetFloat"); case "Decimal":
return datareader.GetMethod("GetDecimal"); case "System.DateTime":
return datareader.GetMethod("GetDateTime");
case "System.":
return datareader.GetMethod("GetDateTime");
}
return null;
} List<Action<T, IDataReader>> actionDics = new List<Action<T, IDataReader>>();
//数据实体类型
var perDic = typeof(T).GetProperties().ToDictionary(p => p.Name);
//生成表头
for (int i = ; i < dr.FieldCount; i++)
{
//获取列名
string colName = dr.GetName(i);
Type DataType = dr.GetFieldType(i);
if (perDic.ContainsKey(colName))
{
actionDics.Add(SetValueToEntity<T>(i, colName, DataType));
}
}
while (dr.Read())
{
T objT = Activator.CreateInstance<T>();
//填充属性值
actionDics.ForEach(p => p.Invoke(objT, dr));
list.Add(objT);
}
结果还是很可人滴,和Dapper不相上下。
下篇希望可以实现增、删、改。希望园友提供下建议。
ORM中去除反射,添加Expression的更多相关文章
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
反射以及Attribute在ORM中的应用 一. 反射什么是反射?简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等.反射有什么用呢?反射不但让你在运行 ...
- 详解C#中的反射
反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B ...
- .net中的反射(转载)
原文地址:http://www.cnblogs.com/Stephenchao/p/4481995.html 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的 ...
- .Net 中的反射(序章) - Part.1
引言 反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它,但对反射的使用作以初步了解在日后的开发中或许会有所帮助. 反射是一个庞大的话题,牵扯到的知识 ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- 【转】详解C#中的反射
原帖链接点这里:详解C#中的反射 反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 详解C#中的反射(转载)
反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是 ...
- 【转】.Net中通过反射技术的应用----插件程序的开发入门
转自:http://www.cnblogs.com/winloa/archive/2012/03/25/2416355.html .Net中通过反射技术的应用----插件程序的开发入门 再开始之前,先 ...
随机推荐
- leetcode—Palindrome 解题报告
1.题目描述 Given a string s, partition s such that every substring of the partition is a palindrome. Ret ...
- 50道经典的JAVA编程题 (6-10)
50道经典的JAVA编程题 (6-10),今晚做了10道了,累死了...感觉难度不是很大,就是不知道是不是最好的实现方法啊!希望大神们能给指点哈... [程序6]GCDAndLCM.java 题目:输 ...
- HDU-4675 GCD of Sequence 数学
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给一个大小为N的数列a[i],然后一个数M以及一个数K,要你求得一个数列b[i],其中b[ ...
- Android应用正确使用扩展SD卡,特别是安卓4.4以后的版本
Android 开发时如何正确获取使用扩展存储路径 在 2.x 版本中,Android设备都是单存储,第三方App写文件,必须申请 WRITE_EXTERNAL_STORAGE 权限: 在4.0之后, ...
- JM编解码264
看到有人说JM解码编码264 尝试了一下http://iphome.hhi.de/suehring/tml/download/win7下 vs2010 编译后,得到编码解码可执行文件ldecod.ex ...
- 教程-最全ASCII 码对照表
第一部分由 00H 到 1FH 共 32 个,一般用来通讯或作为控制之用,有些字符可显示于屏幕,有些则无法显示在屏幕上,但能看到其效果(例如换行字符.归位字符). 第二部分是由 20H 到 7FH 共 ...
- 转载 SharePoint开发部署WSP解决方案包
转载原出处: http://642197992.blog.51cto.com/319331/1582731 注:本文所讲内容以SharePoint2013版本为例,开发工具以VS2013为基础.历史版 ...
- jquery事件函数和原生事件绑定函数中return false的区别
一直听说jquery中事件函数返回false,相当于调用了event.preventDefault()和event.stopPropagation()两个方法,今天就想看看dom中0级.1级.2级事件 ...
- 利用.htacess 实现重定向
步骤: 在网站目录下加入 .htaccess 文件中写 RewriteEngine On RewriteRule ^.*$ index.php 表示开启重写机制 重写到 index.php 的文件
- hdu2545 树上战争 (并查集)
Problem Description 给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜 ...