c#反射优化 表达式树

   public static class FastRefelect
    {
        static Type pType;
        static object cmp;
        static Type mO;
        static Type mT;
        static Type mType;
        static MethodInfo m;
        static int i = 0;
        static int k = 0;
        public static Func<T, MethodInfo, object, object> GetSetDelegate<T>(MethodInfo m, Type type)
        {
            Action<T, MethodInfo, object> set = null;

            if (k == 0)
            {
                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, type);
                var body = Expression.Call(param_obj, m, body_val);
                set = Expression.Lambda<Action<T, MethodInfo, object>>(body, param_obj, param_m, param_val).Compile();
                cmp = set;
                k++;
            }
            else
            {
                set = (Action<T, MethodInfo, object>)cmp;
            }

            return (instance, method, v) =>
            {
                set(instance, method, v);
                return null;

            };

        }

        public static void FastSetValue<T>(this PropertyInfo property, T t, object value)
        {
            if (i == 0)
            {
                pType = property.PropertyType;
                mO = typeof(object);
                mT = typeof(T);
                mType = typeof(MethodInfo);
                m = property.GetSetMethod();
                i++;
            }

            GetSetDelegate<T>(m, pType)(t, m, value);
        }
        public static object FastGetValue<T>(this object obj,System.Linq.Expressions.Expression<Func<T,string>> TProperty)
        {
            var type = obj.GetType();
            //做缓存
            var p = type.GetProperty(TProperty.Body.ToString().Split(‘.‘)[1]);
            //lambda的参数u
            var param_obj = Expression.Parameter(typeof(object), "obj");
            //类型转换
            var convert_obj = Expression.Convert(param_obj, type);
            //lambda的方法体 ((MyMath)obj).Age
            var pGetter = Expression.Property(convert_obj, p);
            //对返回值进行类型转换
            var returnObj = Expression.Convert(pGetter, typeof(object));
            //编译lambda
            var getValue = Expression.Lambda<Func<object, object>>(returnObj, param_obj).Compile();
            return getValue(obj);
        }
    }
时间: 2024-08-25 07:27:02

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

ef 通过反射和表达式树配置全局过滤筛选器

1.软删除接口 1 public interface ISoftDelete 2 { 3 bool IsDeleted { get; set; } 4 } 2.实体类实现 1 public class TestDeleted:ISoftDelete 2 { 3 public int Id { get; set; } 4 5 public string Name { get; set; } 6 public bool IsDeleted { get; set; } 7 8 9 } 3.modelB

用lambda表达式树优化反射

本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作的时候都会比直接调用慢很多,这其中设计到CLR中内部的处理,不做深究.然而,我们在某些情况下又无法不使用反射,比如:在一个ORM框架中,你要将一个DataRow转化为一个对象,但你又不清楚该对象有什么属性,这时候你就需要写一个通用的泛型方法来处理,以下代码写得有点恶心,但不妨碍理解意思: //将Da

使用表达式树和反射来访问对象属性的性能比较

今天在工作上遇到这么个需求:需要获取对象上所有属性的值,但并事先并不知道对象的类型. 我的第一反应就是使用反射,但是这个操作会进行多次,大量的反射肯定会有性能影响.虽然对我这个项目无关紧要,但我还是选择了另外一种解决方案:构建表达式树,再生成委托,然后将委托缓存在字典里.代码如下: 首先构建表达式树(类似这种形式:'(a) => a.xx'),并生成委托: private static Delegate BuildDynamicGetPropertyValueDelegate(PropertyI

[转] 利用表达式树构建委托改善反射性能

最近搞一个系统时由于在比较关键地方用到反射了,所以要关注了一下反射的性能问题.搜索一下,不难搜到老赵的这篇文章,下面是一些杂乱的笔记.(建议先看老赵的文章) .Net4.0反射性能改善 看老赵的文章,老赵得到的结果是这样的: 1 00:00:00.0125539 (Directly invoke) 2 00:00:04.5349626 (Reflection invoke) 3 00:00:00.0322555 (Dynamic executor) 而我把代码搞下来自己运行得到这样的结果: 1

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Linq.Expressions; namespace INPEXOne.LearnCS { class RefletLambdaDelegate { static object[] para

C#表达式树的两种构建----简单示例

C#表达式树的构建方式一种是通过lambda表达式,构建方式很简单Expression<Func<>> name=lambda; Func<>有返回值的委托,系统自己包含的,可以直接调用.<>里边的最后一个参数为返回的参数类型. 下边是我的例子,有一个Users的实体类.传进去一个Users实体,返回一个bool值. 构建完成之后就是调用,表达式树Expressions的Complie()方法,结果为Func<>委托,给委托值就等于把值传给了la

【转载】C# 快速高效率复制对象另一种方式 表达式树

1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } public class StudentSecond { public int Id { get; set; } public string Name { get; set; } p

C# 快速高效率复制对象另一种方式 表达式树

1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } public class StudentSecond { public int Id { get; set; } public string Name { get; set; } p

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如