using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Web; namespace Holworth.Utility
{
//add modi by kexb 2016年11月5日
public static class FastRefelect
{
private static Spring.Caching.ICache GetSpringCache()
{
var ctx = Spring.Context.Support.ContextRegistry.GetContext();
var cache = (Spring.Caching.ICache)ctx.GetObject("AspNetCache");
return cache;
}
public static void AddCache(string key, object value)
{
var cache = GetSpringCache();
cache.Insert(key, value);
}
public static void RemoveCache(string key)
{
var cache = GetSpringCache();
cache.Remove(key);
}
public static object GetSpringCache(string key)
{
var cache = GetSpringCache();
return cache.Get(key);
} public static Func<T, MethodInfo, object, object> GetSetDelegate<T>(MethodInfo m, Type propertyType,string typeName)
{
Action<T, MethodInfo, object> set = null;
string key = typeName + "," + m.Name+","+propertyType.Name+"," + "_FAST_SET_DELEGATE";
if (GetSpringCache(key) == null)
{
Type mO = typeof(object);
Type mT = typeof(T);
Type mType = typeof(MethodInfo); var param_obj = Expression.Parameter(mT, "obj");
var param_val = Expression.Parameter(mO, "val");
var param_m = Expression.Parameter(mType, "m");
var body_val = Expression.Convert(param_val, propertyType);
var body = Expression.Call(param_obj, m, body_val);
set = Expression.Lambda<Action<T, MethodInfo, object>>(body, param_obj, param_m, param_val).Compile();
AddCache(key, set);
}
else
{
set = (Action<T, MethodInfo, object>)GetSpringCache(key); }
return (instance, method, v) =>
{
set(instance, method, v);
return null; }; } public static void FastSetValue<T>(this PropertyInfo property, T t, string typeName, object value)
{ string key = typeName + "," + property.Name + "_FAST_METHOD_INFO";
MethodInfo m = null;
if (GetSpringCache(key) == null)
{
m = property.GetSetMethod();
AddCache(key, m);
}
else
{
m = (MethodInfo)GetSpringCache(key);
} GetSetDelegate<T>(m, property.PropertyType,typeName)(t, m, value);
}
public static object FastGetValue<T>(this object obj, string TypeName, string TProperty)
{
string key = TypeName + "," + TProperty + "_FAST_REFELECT";
Func<object, object> getValue = null;
if (GetSpringCache(key) == null)
{
Type SelfType = Type.GetType(TypeName);
//lambda的参数u
var param_obj = Expression.Parameter(typeof(object), "obj");
//类型转换
var convert_obj = Expression.Convert(param_obj, SelfType);
//lambda的方法体 ((MyMath)obj).Age
var pGetter = Expression.Property(convert_obj, TProperty);
//对返回值进行类型转换
var returnObj = Expression.Convert(pGetter, typeof(object));
//编译lambda
getValue = Expression.Lambda<Func<object, object>>(returnObj, param_obj).Compile();
AddCache(key, getValue);
}
else
{
getValue = (Func<object, object>)GetSpringCache(key); }
return getValue(obj);
}
}
}

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. 历届试题 小数第n位(小技巧)

    问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...

  2. SQL语句 合并列值 将一列的多个值合并成一行

    效果: oralce写法: select WM_CONCAT(A.title) as citys from tmpcity A sql server写法: select stuff((select ' ...

  3. struts2学习(8)struts标签1(数据标签、控制标签)

    一.struts2标签简介: struts标签很多,功能强大,这是优点: 但是缺点的话,性能方面可能会,各方面速度啊啥的会降低:有人比较测试,struts性能比jstl低很多:   二.struts2 ...

  4. 关于adb devices连不上手机的几种情况

    启动adb 1.打开cmd首次使用adb devices,出现下面这两句,就是正在启动adb服务 C:\Users\admin>adb devices List of devices attac ...

  5. js内置对象中获取时间的用法--通过date对象获取。

    Date对象: var today = new Date(); //年份: var year = today.getFullYear(); //月份 var month = today.getMont ...

  6. 灾难恢复:RPO与RTO

    许多企事业单位虽然已经认识到信息安全的重要性,却迟迟没有行动.其中的原因是多方面的,最主要的一个原因就是在如何建立容灾系统的问题上存在种种疑惑.容灾设计指标主要与容灾系统的数据恢复能力有关,最常见的设 ...

  7. 修改tomcat端口后不能IP访问问题

    当tomcat端口被修改以后使用IP访问会发生404的问题,只能通过localhost进行访问,当别人想访问你tomcat下的工程时就会访问失败,此时修改eclipse下的tomcat中的server ...

  8. linux日志查询技巧

    问题描述: 18803959896用户反馈,通讯录备份失败,提示“身份验证失败,请注销账号后重新登录”,不管用账号密码登录还是一键登录,都是提示这个.请协助查询.谢谢~ 备注:三星note3最新版本彩 ...

  9. question?

  10. Halcon中循环读取文件的实现以及数字与字符的转换

    在循环读取文件的位置时,常用到数字与字符的转换. 数字与字符的转换 将字符转换为数字 tuple_number(StringImageIndex,IntImageIndex)` 1 2 1 2 将数字 ...