[源码]Literacy 快速反射读写对象属性,字段
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指令生成方法可以参考
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 快速反射读写对象属性,字段的更多相关文章
- Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...
- Celery 源码解析三: Task 对象的实现
Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...
- fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考
fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考 fileinput 配置项大全 option 属性名 属性类型 描述说明 默认值 language ...
- Centos7源码安装mysql及读写分离,互为主从
Linux服务器 -源码安装mysql 及读写分离,互为主从 一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...
- [C#]反射遍历对象属性
/// <summary> /// C#反射遍历对象属性 /// </summary> /// <typeparam name="T">对象类型 ...
- jQuery源码06-jQuery = function(){};给JQ对象,添加一些方法和属性,extend : JQ的继承方法,jQuery.extend()
/*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //" ...
- mybatis源码解读(二)——构建Configuration对象
Configuration 对象保存了所有mybatis的配置信息,主要包括: ①. mybatis-configuration.xml 基础配置文件 ②. mapper.xml 映射器配置文件 1. ...
- 从yii2框架中的di容器源码中了解反射的作用
反射简介 参考官方简介的话,PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 此外,反射 API 提供了方法来取出函数.类和方法中的文档注释. YII2框架中 ...
- Laravel源码解析之反射的使用
前言 PHP的反射类与实例化对象作用相反,实例化是调用封装类中的方法.成员,而反射类则是拆封类中的所有方法.成员变量,并包括私有方法等.就如"解刨"一样,我们可以调用任何关键字修饰 ...
随机推荐
- In-Memory:在内存中创建临时表和表变量
在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...
- ASP.NET Core 之 Identity 入门(三)
前言 在上一篇文章中,我们学习了 CookieAuthentication 中间件,本篇的话主要看一下 Identity 本身. 最早2005年 ASP.NET 2.0 的时候开始, Web 应用程序 ...
- div实现自适应高度的textarea,实现angular双向绑定
相信不少同学模拟过腾讯的QQ做一个聊天应用,至少我是其中一个. 过程中我遇到的一个问题就是QQ输入框,自适应高度,最高高度为3row. 如果你也像我一样打算使用textarea,那么很抱歉,你一开始就 ...
- Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系
在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...
- zookeeper源码分析之二客户端启动
ZooKeeper Client Library提供了丰富直观的API供用户程序使用,下面是一些常用的API: create(path, data, flags): 创建一个ZNode, path是其 ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- css中line-height行高的深入学习
之前对css中行高line-height的理解还是有些肤浅,深入后才发觉里面包罗万象.学习行高line-height,首先从基本原理开始 (标注该文章转载 http://www.cnblogs.com ...
- iOS之ProtocolBuffer搭建和示例demo
这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...
- postgresql无法安装pldbgapi的问题
要对函数进行调试需要安装插件pldbgapi,当初在windows上面的postgresql实例中执行了一下语句就安装上了: create extension pldbgapi; 但是在linux中执 ...
- D3.js学习(六)
上节我们学习了如何绘制多条曲线, 以及给不同的曲线指定不同的坐标系.在这节当中,我们会对坐标轴标签相关的处理进行学习.首先,我们来想一个问题, 如何我们的x轴上的各个标签的距离比较近,但是标签名又比较 ...