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中通过反射技术的应用----插件程序的开发入门 再开始之前,先 ...
随机推荐
- return遇到finally
public class Test { public static void main(String[] args) { System.out.println("=============t ...
- Java 开发@ JDBC链接SQLServer2012
下面请一字一句地看,一遍就设置成功,比你设置几十遍失败,费时会少得多. 首先,在连接数据库之前必须保证SQL Server 2012是采用SQL Server身份验证方式而不是windows身份验证方 ...
- 使用SecureCRT远程 SSH 登陆 CentOS 和 Ubuntu
1.CentOS下安装SSH 使用下列命令查看当前系统是否已经安装 ssh 和 rsync.rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件. rpm –qa | gre ...
- 应用web框架模块设计三国演义篇--转至微博
从事web开发已经10年时间,近几年也一直从事微博应用产品的研发.从原生php写网站到使用cms bbs整合的大型站点,从使用各种流行的开源开发框架到成熟稳定的平台级框架下做研发.这期间对应用型web ...
- Hadoop概念学习系列之hadoop、spark常备查询网址(二十九)
http://archive.apache.org/dist
- HTML5如何播放本地文件
HTML5在操作的过程中,很多朋友会遇到一个问题,那就是在播放本地文件的时候时常会有一些问题存在,使得HTML5才操作的过程中本地文件播放不流畅或者是不能够正常的播放.现在,我们就来看看HTML5如何 ...
- 谷歌官方刷新组件SwipeRefreshLayout
今天开始使用谷歌的SwipeRefreshLayout,会记下一些坑 1.手动调用setRefreshing(true)不会出现刷新动画 原因是:SwipeRefreshLayout indicato ...
- 设计模式23---设计模式之装饰模式(Decorator)(结构型)
1.装饰模式讲解 1.1定义 动态的给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更加灵活. 1.2装饰模式要点 透明的给一个对象增加功能,换句话说就是要给一个对象增加功能,但是不能 ...
- 传统XmlDocument操作
需要引用的命名空间: using System.Xml; 常用的类:XmlDocument.XmlElement.XmlNode.XmlNodeList 一.使用XmlDocument创建xml // ...
- 【转】Netty那点事(四)Netty与Reactor模式
[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch4-reactor.md 一:Netty.NIO.多线程? 时 ...