C# 反射与特性:原理 + 用法 + 性能优化,一文吃透
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
一、核心原理:反射与特性到底是什么?1. 反射(Reflection):程序的 “自我认知” 能力反射的底层逻辑C#代码编译后会生成 IL(中间语言)和元数据(Metadata),元数据中包含了所有类型的定义、成员信息、访问修饰符等关键数据。反射的本质就是:
2. 特性(Attribute):代码的 “自定义标签”特性的核心规则
二、实战用法:从基础到进阶前置说明
1. 特性:自定义标签的定义与使用步骤 1:定义自定义特性
步骤 2:给代码打 “标签”
2. 反射:读取特性 + 动态操作类型场景 1:读取特性元数据
输出结果
场景 2:反射核心操作(创建实例 + 调用方法)
输出结果
三、性能优化:反射慢?这样解决!1. 缓存反射结果(最有效)
2. 使用 Delegate.CreateDelegate(比 Invoke 快 5~10 倍)
3. 使用表达式树(Expression)
4. 进阶方案:使用 Emit 或第三方库ILGenerator(Emit):直接生成 IL 代码,性能最优,但学习成本高; 第三方库:如FastMember、ImpromptuInterface,封装了高性能反射逻辑,开箱即用。 5. 避坑:这些场景别用反射高频调用的核心逻辑(如循环内); 对性能要求极高的场景(如游戏帧更新); 可通过接口 / 泛型替代的静态场景。 四、典型应用场景1.框架开发:如Core 的[HttpGet]、[Authorize]特性,EF Core 的[Key]、[Required]特性; 2.序列化 / 反序列化:如 Newtonsoft.Json 通过反射读取属性,实现对象与 JSON 互转;3.依赖注入:DI 容器通过反射创建对象实例,解析依赖关系;4.自定义配置:给类 / 方法打标签,通过反射读取配置,实现灵活的逻辑控制;5.单元测试:反射调用私有方法,完成测试覆盖。总结1.核心本质:反射是运行时读取 / 操作元数据的能力,特性是给代码添加自定义元数据的载体,二者结合可实现高度灵活的代码逻辑; 2.核心用法:自定义特性需继承Attribute并限定作用范围,反射可读取特性、动态创建实例 / 调用方法; 3.性能优化:优先缓存反射结果,其次使用委托 / 表达式树替代Invoke,高频场景避免直接使用反射。 阅读原文:原文链接 该文章在 2026/2/11 9:31:55 编辑过 |
关键字查询
相关文章
正在查询... |