• .net的反射(Reflection) 是.Net中获取运行时类型信息的一种方法,通过反射编码的方式可以获得 程序集,模块,类型,元数据等信息。
    反射的优点在于微软提供的API调用简单,使用方便;

  • 表达式树(Expression Tree)表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,表达式树经过编译后生成的直接是IL代码;

  • IL Emit 是直接操作IL的执行过程,对IL代码精细化控制;

属性赋值操作 PropertyInfo.GetValue/SetValue是反射中常用的功能;
三种实现方式的性能对比:

  public class Bar{public int Id { get; set; }public string Name { get; set; }}public class Foo{public Bar Bar { get; set; }public static void SetReflection(Foo foo, Bar bar){var property = foo.GetType().GetProperty("Bar");property.SetValue(foo, bar);}public static Action<Foo, Bar> SetExpression(){var property = typeof(Foo).GetProperty("Bar");var target = Expression.Parameter(typeof(Foo));ParameterExpression propertyValue = Expression.Parameter(typeof(Bar));//var setPropertyValue = Expression.Call(target, property.GetSetMethod(), propertyValue);BinaryExpression setPropertyValue = Expression.Assign(Expression.Property(target, property), propertyValue);var setAction = Expression.Lambda<Action<Foo, Bar>>(setPropertyValue, target, propertyValue).Compile();return setAction;}public static Action<Foo, Bar> SetEmit(){var property = typeof(Foo).GetProperty("Bar");DynamicMethod method = new DynamicMethod("SetValue", null, new Type[] { typeof(Foo), typeof(Bar) });ILGenerator ilGenerator = method.GetILGenerator();ilGenerator.Emit(OpCodes.Ldarg_0);ilGenerator.Emit(OpCodes.Ldarg_1);ilGenerator.EmitCall(OpCodes.Callvirt, property.GetSetMethod(), null);ilGenerator.Emit(OpCodes.Ret);method.DefineParameter(1, ParameterAttributes.In, "obj");method.DefineParameter(2, ParameterAttributes.In, "value");var setAction2 = (Action<Foo, Bar>)method.CreateDelegate(typeof(Action<Foo, Bar>));return setAction2;}public static void Test(){var act1 = Foo.SetExpression();var act2 = Foo.SetEmit();var st = new Stopwatch();st.Start();for (int i = 0; i < 1000000; i++){var foo = new Foo { };var bar = new Bar { Id = 1, Name = "name" };Foo.SetReflection(foo, bar);}Console.WriteLine("Reflection " + st.ElapsedMilliseconds);st.Restart();for (int i = 0; i < 1000000; i++){var foo = new Foo { };var bar = new Bar { Id = 1, Name = "name" };act1(foo, bar);}Console.WriteLine("Expression " + st.ElapsedMilliseconds);st.Restart();for (int i = 0; i < 1000000; i++){var foo = new Foo { };var bar = new Bar { Id = 1, Name = "name" };act2(foo, bar);}Console.WriteLine("Emit " + st.ElapsedMilliseconds);}}

循环多次操作性能对比还是明显的表达式数和emit的性能优势明显;
测试结果

但是只循环一次的话 三种实现方式性能是无差别的,所以在一般情况下,反射的性能损失是可以忽略的;

转载于:https://www.cnblogs.com/sands/p/11373569.html

反射,Expression Tree,IL Emit 属性操作对比相关推荐

  1. 一起谈.NET技术,关于Expression Tree和IL Emit的所谓的quot;性能差别quot;

    昨天写了<三种属性操作性能比较>,有个网友写信问我一个问题:从性能上看,Expression Tree和IL Emit孰优孰劣?虽然我在回信中作了简单的回答,但不知道这个网友是否懂我的意思 ...

  2. 三种属性操作性能比较:PropertyInfo + Expression Tree + Delegate.CreateDelegate

    在<上篇>中,我比较了三种属性操作的性能:直接操作,单纯通过PropertyInfo反射和IL Emit.本篇继续讨论这个话题,我们再引入另外两种额外的属性操作方式:Expression ...

  3. Expression Tree 上手指南 (二)

    上回我们说到Expression Tree是一种表示编程语言中"表达式"概念的树状数据结构,并且学习了从Lambda表达式自动生成表达式树的C#语法.那么它到底有什么用呢?其实上一 ...

  4. [转]打造自己的LINQ Provider(上):Expression Tree揭秘

    概述 在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞,如LINQ to NHiber ...

  5. NET(C#):使用Expression Tree构建带有参数、本地变量和返回值的Lambda

    .NET(C#):使用Expression Tree构建带有参数.本地变量和返回值的Lambda 对于参数,需要使用Expression.Parameter创建ParameterExpression对 ...

  6. 快速上手Expression Tree(一):做一做装配脑袋的Expression Tree 习题

    装配脑袋的习题在这里:Expression Tree上手指南 (一) 不了解Expression Tree的同学可以去看下,很好,很强大. 1: -a 2: a + b * 2 我把这些问题都弄成了方 ...

  7. (DT系列四)驱动加载中, 如何取得device tree中的属性

    转载于: http://blog.csdn.net/lichengtongxiazai/article/details/38941933 本文以At91rm9200平台为例,从源码实现的角度来分析驱动 ...

  8. Leetcode 1628. Design an Expression Tree With Evaluate Function [Python]

    System Design.使用stack存入数字,当遇到操作符号时,弹出stack中的数字.先出的为right,后出为left.完成操作后再压入stack.操作过程写在tree的evaluate函数 ...

  9. 通过反射动态修改自定义注解属性值

    通过反射动态修改自定义注解属性值 java/lang/reflect 这个包下面都是Java的反射类和工具. Annotation 注解,也是位于这个包里的. 注解自从Java 5.0版本引入后,就成 ...

最新文章

  1. python3.0视频教程_python中文视频教程(全38集),全套视频教程学习资料通过百度云网盘下载...
  2. java try catch嵌套_解析Java中未被捕获的异常以及try语句的嵌套使用
  3. Quartus II18.0安装教程
  4. Spring Boot 集成测试
  5. 【学习记录】macOS的Redis安装及基本使用
  6. 2025.wireshark工具使用
  7. [家里蹲大学数学杂志]第413期插值不等式
  8. 漫画:什么是 ZooKeeper?
  9. 手机屏幕驱动板1080x1920分辨率HDMI红米note3 note4 note4x屏幕Fondar自制投影 光固化
  10. 窗户控制app开发day1(机智云的二次开发之换皮肤)
  11. 【无线电】摩尔斯电码的快速记忆法
  12. 202203Self-Supervised Pretraining and Controlled Augmentation Improve RareWildlife Recognition inUAV
  13. 酷比魔方iwork8刷机shell_酷比魔方iwork8旗舰版刷机教程及固件上线
  14. Ubuntu系统下搭建svn服务器(及设置SVN提交必须输入注释)
  15. 3.2收缩-扩张喷管实例
  16. Linux下根据用户ID查询用户名
  17. 计算机组成原理运算器数据,计算机组成原理-运算器实验
  18. RK3568 VCM 驱动
  19. 自适应巡航 自动泊车 车道偏离 碰撞预警 自动驾驶之辅助驾驶技术简介
  20. 计算机基础课目录,计算机基础课程Word目录自动生成机制

热门文章

  1. python打地鼠游戏代码_妈妈和宝宝在家,自己做了个打地鼠游戏,网友:宝宝笑得好开心...
  2. 看了这篇C++笔记,你出去行走江湖我就放心了【C++】
  3. operator new/delete,operator-> / *【C++运算符重载】
  4. Oracle 同义词(synonym) 简介
  5. [转]将Ubuntu默认的邮件客户端Evolution替换为Thunderbird
  6. html 渐变透明写法,CSS3透明度+渐变
  7. lstm 根据前文预测词_干货 | Pytorch实现基于LSTM的单词检测器
  8. 算法分析股票类型的相关题型
  9. python获取时间周数_【手把手教你】Python量化策略风险指标
  10. oracle+创建序列自增,oracle序列详解和建立自增主键