LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 反射与特性:原理 + 用法 + 性能优化,一文吃透

admin
2026年2月10日 23:12 本文热度 67
你是否在项目中遇到过这些场景:需要动态创建对象、调用未知方法,或者想给代码添加自定义元数据却无从下手?C#的反射(Reflection)与特性(Attribute)正是解决这类问题的 “利器”—— 前者让程序能 “自审” 和操控自身代码,后者让你能给代码打上自定义 “标签”。

本文将从底层原理、实战用法到性能优化,全方位拆解反射与特性,帮你真正吃透这两个核心知识点,告别 “只会用但不懂原理” 的尴尬。

一、核心原理:反射与特性到底是什么?

1. 反射(Reflection):程序的 “自我认知” 能力

反射是.NET 提供的一组 API,允许程序在运行时获取自身的类型信息(如类、方法、属性、字段),并能动态创建实例、调用方法、读写属性 / 字段 —— 简单说,就是让代码 “看清自己长什么样”,还能 “动手操作自己”。

反射的底层逻辑C#

代码编译后会生成 IL(中间语言)和元数据(Metadata),元数据中包含了所有类型的定义、成员信息、访问修饰符等关键数据。

反射的本质就是:

  1. CLR 加载程序集时解析元数据;
  2. 反射 API(System.Reflection命名空间)读取这些元数据;
  3. 运行时根据元数据动态操作类型,而非编译时确定。

2. 特性(Attribute):代码的 “自定义标签”

特性是一种特殊的类,用于给程序集、类、方法、属性等代码元素添加元数据(描述数据的数据)。特性本身不直接影响代码逻辑,但能被反射读取,从而实现 “基于标签的逻辑控制”。

特性的核心规则

  • 所有特性都继承自System.Attribute基类;
  • 特性通过[特性名]的语法标注在代码元素上;
  • 特性的元数据会被写入程序集,可通过反射读取。

二、实战用法:从基础到进阶

前置说明

所有示例需引入核心命名空间:

1. 特性:自定义标签的定义与使用

步骤 1:定义自定义特性

先创建一个标记 “接口文档信息” 的特性,包含接口名称、版本、作者:

步骤 2:给代码打 “标签”

2. 反射:读取特性 + 动态操作类型

场景 1:读取特性元数据

输出结果

场景 2:反射核心操作(创建实例 + 调用方法)

先定义一个实现类:
再通过反射动态操作:

输出结果

三、性能优化:反射慢?这样解决!

反射的核心问题是运行时解析元数据 + 动态调用,比直接调用慢 10~100 倍,但通过以下优化手段,可将性能损耗降到最低。

1. 缓存反射结果(最有效)

反射的 “慢” 主要集中在GetType()GetMethod()GetProperty()等获取元数据的步骤,而非调用本身。将这些结果缓存到字典 / 静态变量中,避免重复解析

2. 使用 Delegate.CreateDelegate(比 Invoke 快 5~10 倍)

将反射获取的 MethodInfo 转换为强类型委托,避免每次 Invoke 的装箱 / 拆箱开销:

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,高频场景避免直接使用反射。

反射与特性是 C#中 “灵活性” 的核心体现,掌握它们不仅能读懂框架源码,更能在项目中写出更优雅、更灵活的代码 —— 从原理到优化,吃透这篇就够了!


阅读原文:原文链接


该文章在 2026/2/11 9:31:55 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved