Literacy 说明

Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多

当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但不能提高性能,反而会使性能下降,所以使用场合需要自己把握

下面是在我的电脑上做的一些测试(因机器配置不同会有少许误差)

测试次数 Literacy 反射
10 16ms 0ms
100 15ms 0ms
1K 16ms 5ms
1W 16ms 50ms
10W 23ms 505ms
100W 87ms 5149ms

所以可以看出,再次数越多的时候和反射的差距越大,在100次以下反射几乎不消耗时间,而IL生成委托就要消耗16ms

关于IL指令生成方法可以参考

玩转动态编译 - 高级篇:一,IL访问静态属性和字段

玩转动态编译 - 高级篇:二,IL设置静态属性,字段和类型转换

玩转动态编译 - 高级篇:三,实例属性的读取与设置

  Literacy 常用属性方法

 Literacy  方法
 Literacy(Type type)  构造函数,加载所有公开属性
 Literacy(Type type, bool ignoreCase)

构造函数,加载所有公开属性

ignoreCase 指示属性名是否区分大小写

 NewObject()

调用对象的无参构造函数,新建对象

 Literacy 静态方法  
 CreateNewObject(Type type, Type[] argTypes = null)  IL构造一个用于调用对象指定构造函数的委托
 CreateGetter(PropertyInfo prop)  IL构造一个用于获取对象属性值的委托
 CreateGetter(FieldInfo field)  IL构造一个用于获取对象字段值的委托
 CreateSetter(PropertyInfo prop)  IL构造一个用于设置对象属性值的委托
 CreateSetter(FieldInfo field)  IL构造一个用于设置对象字段值的委托
 Literacy.Load 属性  
 Load.PublicField()  加载公开的实例字段
 Load.NonPublicField()  加载非公开的实例字段
 Load.StaticField(bool hasNonPublic)  加载公开静态的字段
 参数hasNonPublic指示是否同时加载非公开的静态字段
 Load.NonPublicProperty()  加载非公开的实例属性
 Load.StaticProperty(bool hasNonPublic)  加载公开静态的属性
 参数hasNonPublic指示是否同时加载非公开的静态属性
Literacy.Property 属性  
 Property[string name]  获取指定属性的ObjectProperty对象
 Property[string name].GetValue(obj instance)  获取实例对象的指定属性的值
 Property[string name].TryGetValue(object instance, out object value)  尝试获取实例对象的指定属性的值,失败返回false
 Property[string name].SetValue(object instance, object value)  设置实例对象的指定属性的值
 Property[string name].TrySetValue(object instance, object value)  尝试设置实例对象的指定属性的值,失败返回false
 Literacy.Field 属性  如果没有手动加载字段,该属性为null
 Field[string name]  获取指定字段的ObjectProperty对象
 Field[string name].GetValue(obj instance)  获取实例对象的指定字段的值
 Field[string name].TryGetValue(object instance, out object value)  尝试获取实例对象的指定字段的值,失败返回false
 Field[string name].SetValue(object instance, object value)  设置实例对象的指定字段的值
 Field[string name].TrySetValue(object instance, object value)  尝试设置实例对象的指定字段的值,失败返回false

  Literacy调用实例

  Literacy源码下载

源码下载

[源码]Literacy 快速反射读写对象属性,字段的更多相关文章

  1. Spring IOC 容器源码分析 - 创建原始 bean 对象

    1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...

  2. Celery 源码解析三: Task 对象的实现

    Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...

  3. fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考

    fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考 fileinput 配置项大全 option 属性名 属性类型 描述说明 默认值 language ...

  4. Centos7源码安装mysql及读写分离,互为主从

       Linux服务器 -源码安装mysql 及读写分离,互为主从   一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...

  5. [C#]反射遍历对象属性

    /// <summary> /// C#反射遍历对象属性 /// </summary> /// <typeparam name="T">对象类型 ...

  6. jQuery源码06-jQuery = function(){};给JQ对象,添加一些方法和属性,extend : JQ的继承方法,jQuery.extend()

    /*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //" ...

  7. mybatis源码解读(二)——构建Configuration对象

    Configuration 对象保存了所有mybatis的配置信息,主要包括: ①. mybatis-configuration.xml 基础配置文件 ②. mapper.xml 映射器配置文件 1. ...

  8. 从yii2框架中的di容器源码中了解反射的作用

    反射简介 参考官方简介的话,PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 此外,反射 API 提供了方法来取出函数.类和方法中的文档注释. YII2框架中 ...

  9. Laravel源码解析之反射的使用

    前言 PHP的反射类与实例化对象作用相反,实例化是调用封装类中的方法.成员,而反射类则是拆封类中的所有方法.成员变量,并包括私有方法等.就如"解刨"一样,我们可以调用任何关键字修饰 ...

随机推荐

  1. jQuery之ajax实现篇

    jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...

  2. kafka配置与使用实例

    kafka作为消息队列,在与netty.多线程配合使用时,可以达到高效的消息队列

  3. CentOS下mysql数据库常用命令总结

    mysql数据库使用总结 本文主要记录一些mysql日常使用的命令,供以后查询. 1.更改root密码 mysqladmin -uroot password 'yourpassword' 2.远程登陆 ...

  4. Twproject Gantt开源甘特图功能扩展

    1.Twproject Gantt甘特图介绍 Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CS ...

  5. 通过自定义特性,使用EF6拦截器完成创建人、创建时间、更新人、更新时间的统一赋值(使用数据库服务器时间赋值,接上一篇)

    目录: 前言 设计(完成扩展) 实现效果 扩展设计方案 扩展后代码结构 集思广益(问题) 前言: 在上一篇文章我写了如何重建IDbCommandTreeInterceptor来实现创建人.创建时间.更 ...

  6. BPM Domino集成解决方案

    一.需求分析 Lotus Notes/Domino是IBM的协同办公平台,在国内有广泛的用户. 但由于推出年头较早.采用文档数据库等特点, 导致其流程集成能力弱.统计分析难.不支持移动办公等问题,很多 ...

  7. Android:Activity+Fragment及它们之间的数据交换.

    Android:Activity+Fragment及它们之间的数据交换 关于Fragment与Fragment.Activity通信的四种方式 比较好一点的Activity+Fragment及它们之间 ...

  8. ios label 自动计算行高详解

    在OC当中自动计算行高主要调用系统的 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff } span ...

  9. Atitit.研发管理如何避免公司破产倒闭的业务魔咒

    Atitit.如何避免公司破产倒闭的业务魔咒 1. 大型公司的衰落或者倒闭破产案例1 1.1. 摩托罗拉1 1.2. 诺基亚2 1.3. sun2 2. 为什么他们会倒闭?? 常见的一些倒闭元素2 2 ...

  10. 【一起学OpenFoam】01 OpenFoam的优势

    CFD技术发展到今天,已经超过了大半个世纪了,已经涌现出非常多的CFD软件可供人们使用.通用商业CFD软件譬如Fluent.CFX.Star CCM+等在工业上得到了广泛的应用,另外一些专用的软件(如 ...