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中通过反射技术的应用----插件程序的开发入门 再开始之前,先 ...
随机推荐
- Mysql的函数使用方法
今天有点临时需求要计算一张表的结果,不想写代码,想到了mysql的自定义函数.碰到了很多问题,为了方便一下使用,在此记录一下. 需求:一张表中,有比分,需要查询出比赛id和比赛结果. 分析: ...
- 【noip2012】开车旅行
题意: 给n个点的海拔h[i](不同点海拔不同) 两点的距离为abs(h[i]-h[j]) 有a.b两人轮流开车(只能往下标大的地方开) a每次会开到里当前点第二近的点 b每次会开到离当前点最近的点( ...
- Java持久化存储对象Properties的方法list、store、load
package FileDemo; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStrea ...
- HDU 4628
这是一个大水题啊... 因为比赛时不会算复杂度耽误半天. i从0到2^n枚举集合i的所有分割两半的情况的复杂度为O(3^n),可以想象这个过程相当于是给每个位标记0,1,2(0表示不选,1,2表示两个 ...
- java中几个特殊的类
1 内部类-----是在其他类中的类 1.1 内部类的定义 将类定义为 class xxxx{... ...}置于某个类的内部即可‘ 内部类编译时生成 xxxx$xxxx的class文件 内部类不能够 ...
- 避免SWF被内存提取工具提取的方法
内存工具从内存中抓取SWF一般是依靠寻找SWF的前7个字节(3个SWF文件必有的标示字节“FWS”或“CWS”或“ZWS”+4个记录该SWF文件长度的字节),所以避免被提取我们只要在加载SWF到内存后 ...
- C#- 实用的Log4Net日志记录例子
工作中也是要用到日志记录的,LOG4NET在这块做的不错,以后可以继续拿来用. 1.引用DLL 2.LOG4NET的配置文件 <?xml version="1.0" enco ...
- ecshop在线手册前言及程序结构
该在线手册是有模版堂转载而来:仅供参考 一.前言 为什么我们ecshop模板堂要重制ecshop在线手册呢?因为目前网上的一些教程有些是比较老的,有些是不全面的,官方的手册也已经很久没有更 新,很多刚 ...
- JavaScript要点(九)HTML DOM
通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...
- iOS UICollectionView基础
转载自:http://www.cnblogs.com/wayne23/p/4013522.html 初始化部分: UICollectionViewFlowLayout *flowLayout= [[ ...