1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Reflection;
  6. using System.Text;
  7. using System.Web;
  8.  
  9. namespace Holworth.Utility
  10. {
  11. //add modi by kexb 2016年11月5日
  12. public static class FastRefelect
  13. {
  14. private static Spring.Caching.ICache GetSpringCache()
  15. {
  16. var ctx = Spring.Context.Support.ContextRegistry.GetContext();
  17. var cache = (Spring.Caching.ICache)ctx.GetObject("AspNetCache");
  18. return cache;
  19. }
  20. public static void AddCache(string key, object value)
  21. {
  22. var cache = GetSpringCache();
  23. cache.Insert(key, value);
  24. }
  25. public static void RemoveCache(string key)
  26. {
  27. var cache = GetSpringCache();
  28. cache.Remove(key);
  29. }
  30. public static object GetSpringCache(string key)
  31. {
  32. var cache = GetSpringCache();
  33. return cache.Get(key);
  34. }
  35.  
  36. public static Func<T, MethodInfo, object, object> GetSetDelegate<T>(MethodInfo m, Type propertyType,string typeName)
  37. {
  38. Action<T, MethodInfo, object> set = null;
  39. string key = typeName + "," + m.Name+","+propertyType.Name+"," + "_FAST_SET_DELEGATE";
  40. if (GetSpringCache(key) == null)
  41. {
  42. Type mO = typeof(object);
  43. Type mT = typeof(T);
  44. Type mType = typeof(MethodInfo);
  45.  
  46. var param_obj = Expression.Parameter(mT, "obj");
  47. var param_val = Expression.Parameter(mO, "val");
  48. var param_m = Expression.Parameter(mType, "m");
  49. var body_val = Expression.Convert(param_val, propertyType);
  50. var body = Expression.Call(param_obj, m, body_val);
  51. set = Expression.Lambda<Action<T, MethodInfo, object>>(body, param_obj, param_m, param_val).Compile();
  52. AddCache(key, set);
  53. }
  54. else
  55. {
  56. set = (Action<T, MethodInfo, object>)GetSpringCache(key);
  57.  
  58. }
  59. return (instance, method, v) =>
  60. {
  61. set(instance, method, v);
  62. return null;
  63.  
  64. };
  65.  
  66. }
  67.  
  68. public static void FastSetValue<T>(this PropertyInfo property, T t, string typeName, object value)
  69. {
  70.  
  71. string key = typeName + "," + property.Name + "_FAST_METHOD_INFO";
  72. MethodInfo m = null;
  73. if (GetSpringCache(key) == null)
  74. {
  75. m = property.GetSetMethod();
  76. AddCache(key, m);
  77. }
  78. else
  79. {
  80. m = (MethodInfo)GetSpringCache(key);
  81. }
  82.  
  83. GetSetDelegate<T>(m, property.PropertyType,typeName)(t, m, value);
  84. }
  85. public static object FastGetValue<T>(this object obj, string TypeName, string TProperty)
  86. {
  87. string key = TypeName + "," + TProperty + "_FAST_REFELECT";
  88. Func<object, object> getValue = null;
  89. if (GetSpringCache(key) == null)
  90. {
  91. Type SelfType = Type.GetType(TypeName);
  92. //lambda的参数u
  93. var param_obj = Expression.Parameter(typeof(object), "obj");
  94. //类型转换
  95. var convert_obj = Expression.Convert(param_obj, SelfType);
  96. //lambda的方法体 ((MyMath)obj).Age
  97. var pGetter = Expression.Property(convert_obj, TProperty);
  98. //对返回值进行类型转换
  99. var returnObj = Expression.Convert(pGetter, typeof(object));
  100. //编译lambda
  101. getValue = Expression.Lambda<Func<object, object>>(returnObj, param_obj).Compile();
  102. AddCache(key, getValue);
  103. }
  104. else
  105. {
  106. getValue = (Func<object, object>)GetSpringCache(key);
  107.  
  108. }
  109. return getValue(obj);
  110. }
  111. }
  112. }

c#反射优化 表达式树的更多相关文章

  1. 添加一种emit的应用,反射发出,较直接调用稍慢,但好过反射与表达式树。

    System.Reflection.MethodInfo mInfo = typeof(TypeParse).GetMethod("Add", System.Reflection. ...

  2. C# 反射 表达式树 模糊搜索

    反射实体T,非datetime字段反射获取表达式树   public static Expression<Func<T, bool>> GetSearchExpression& ...

  3. LinqToDB 源码分析——处理表达式树

    处理表达式树可以说是所有要实现Linq To SQL的重点,同时他也是难点.笔者看完作者在LinqToDB框架里面对于这一部分的设计之后,心里有一点不知所然.由于很多代码没有文字注解.所以笔者只能接合 ...

  4. 利用表达式树Expression优化反射性能

    最近做了一个.Net Core环境下,基于NPOI的Excel导入导出以及Word操作的服务封装,涉及到大量反射操作,在性能优化过程中使用到了表达式树,记录一下. Excel导入是相对比较麻烦的一块, ...

  5. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  6. 用lambda表达式树替代反射

    本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作 ...

  7. C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 【C#表达式树 七】 反射在表达式树中的应用 ListInitExpression

    以下都是反射在表达式树中的应用 对象初始化 Expression.MemberInit 反射获取成员(字段 或者属性),绑定数据,然后生成 成员表达式节点 class Animal { public ...

  9. 干货!表达式树解析"框架"(1)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 关于我和表达式树 其实我也没有深入了解表达式树一些内在实现的原理 ...

随机推荐

  1. 安卓5.0宣告了ARM平台全面进入64位时代

    安卓5.0宣告了ARM平台全面进入64位时代 2014年10月份,安卓5.0正式版发布了,安卓5.0支持64位CPU,安卓5.0全面启用ART运行模式,在程序安装的时候,进行预编译,新的运行环境能够使 ...

  2. Java-Runoob-面向对象:Java 多态

    ylbtech-Java-Runoob-面向对象:Java 多态 1.返回顶部 1. Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操 ...

  3. ngui自适应

    增加UIROOT using UnityEngine; namespace Com.Xyz.UI { [ExecuteInEditMode] [RequireComponent(typeof(UIRo ...

  4. 【做题记录】USACO gold * 50(第一篇)

    orz xhk 5/50 1597: [Usaco2008 Mar]土地购买 $ f[i]=min(f[j]+x[i]*y[j+1]) $ 然后斜率优化 1699: [Usaco2007 Jan]Ba ...

  5. php-7.1和apache httpd-2.4.29 windows环境配置

    一.apaceh2.4配置 (一).修改apache2.4.29的httpd.conf安装目录文件,第38行 原Define SRVROOT "/Apache24" 修改为(你自己 ...

  6. zabbix server的Discover功能,实现zabbix agent 大批量的自动添加,并链接到指定的模版(3)

    一.需求 zabbix 服务器可以手动加入zabbix-agent客户端,对于少量的机器,这没有什么.但到了线上,我们有大量的服务器需要监控时,如果再一个个的手动加的话,工作量势必会增加很多.这时,z ...

  7. [CSAPP] Chapter 1 Overview of Computer

    1.1 information is bits + context All computer programs are just a sequence of bits, each with a val ...

  8. TCP超时与重传机制

    TCP超时与重传机制    TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制.其基本原理:在发送一个数据之后,就开启一个定时器 ...

  9. 安装mule-standalone说明

    1,将mule-standalone-3.4.0.zip 放到 /usr/local/ 下 2,unzip mule-standalone-3.4.0.zip 3, cd /usr/local/mul ...

  10. mysql varchar类型转换int类型

    select * from gyzd_yysinfo order by cast(yysid as SIGNED INTEGER) 或者 select * from gyzd_yysinfo orde ...