[源码]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源码下载
我写的文章,除了纯代码,其他的都是想表达一种思想,一种解决方案.希望各位看官不要局限于文章中的现成的代码,要多关注整个文章的主题思路,谢谢!
我发布的代码,没有任何版权,遵守WTFPL协议(如有引用,请遵守被引用代码的协议)
qq群:5946699 希望各位喜爱C#的朋友可以在这里交流学习,分享编程的心得和快乐
我发布的代码,没有任何版权,遵守WTFPL协议(如有引用,请遵守被引用代码的协议)
qq群:5946699 希望各位喜爱C#的朋友可以在这里交流学习,分享编程的心得和快乐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述