反射与特性

反射:

反射(Reflection)是 C# 中的一种机制,允许程序在运行时检查和操作对象的类型信息。通过反射,你可以在运行时获取类的元数据(如属性、方法、字段、构造函数等),并动态地创建对象、调用方法或访问属性。

反射的主要用途

  1. 动态加载和使用类型:在编译时不知道具体类型的情况下,可以在运行时加载和使用类型。

  2. 检查和操作对象:可以在运行时检查对象的类型信息,并调用其方法或访问其属性。

  3. 序列化和反序列化:在序列化和反序列化过程中,反射可以用于动态地创建对象并设置其属性。

  4. 插件系统:反射可以用于动态加载和执行插件。

特性:

在 C# 中,特性(Attributes)是一种用于向程序元素(如类、方法、属性、字段等)添加元数据的机制。特性可以提供关于程序元素的额外信息,这些信息可以在编译时或运行时通过反射来访问和使用。

特性的主要用途

  1. 文档化:为代码提供额外的文档信息。

  2. 行为控制:控制编译器或运行时的行为。

  3. 元数据:提供关于程序元素的元数据,如作者、版本、描述等。

  4. 自定义行为:实现自定义的特性,以满足特定需求。

使用案例一:

使用反射找到特性,并用作判断条件来选择是否打印对象里属性的值。

给其中一个属性加上特性。使在使用时其不显示。

实例化对象,并调用自定义反射函数。

使用GetCustomAttribute拿到对应特性,判断是否存在JsonIgnore特性,存在就忽略。

结果:使用JsonIgnore特性标注的ID属性,没有输出。

注意: GetCustomAttribute与GetCustomAttributes的区别,带s的为获取同类型特性列表。

使用案例二:

自定义特性,使用反射拿到并做处理。

自定义特性。

给属性标上特性,并在放射中判断特性中的属性。

结果。

注: 特性特殊写法:给没有在构造函数里的初始化的属性赋值。

使用案例三:

自定义特性,并使用反射来动态实例化对象(可用于测试用例)。

Parameters属性用于存函数调用时用到的参数,如下图。

使用示例。

使用Activator.CreateInstance创建对象。

结果。

结论:

1、 特性是一个继承Attribute的用于给其他类、属性或方法"打标签、打Tag"的Class,可以通过AttributeUsage限制可以写特性的是类、属性或方法。

2、反射是是使用GetType() GetProperties() 和 GetMethods() 拿到类、属性或方法后通过GetCustomAttribute<>拿到写在上面的特性(Tag)然后来确定如何去处理这个类、属性或方法。甚至可以使用Activator.CreateInstance(type)来创建一个实例

参考:

arduino 复制代码
【C#中的反射与特性大致是怎么一回事】 https://www.bilibili.com/video/BV1P84y1T74w/?share_source=copy_web&vd_source=12c510f4de2a2c910d478336fceb8ff5
相关推荐
程序员飞哥9 小时前
重构 AI 思维(一):Prompt Engineering,如何下达不可违抗的指令?
人工智能·后端
皮皮林55110 小时前
@Autowired 和 @Resource 注解有啥区别?你这项目怎么还混着用呢?
后端
程序员小假11 小时前
HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·后端
wangbing112511 小时前
踩坑:el8应用装在el9上
开发语言·后端·ruby
kyriewen1112 小时前
你等的Babel编译,够喝三杯咖啡了——用Rust重写的SWC,只需眨个眼
开发语言·前端·javascript·后端·性能优化·rust·前端框架
IT_陈寒13 小时前
SpringBoot自动配置坑了我,原来要这样绕过去
前端·人工智能·后端
东方小月13 小时前
Claude Code 完整上手指南:MCP、Skills、第三方模型配置一次搞定
前端·人工智能·后端
凤山老林13 小时前
从0到1搭建企业级权限管理系统:Spring Boot + JWT + RBAC实战指南
java·spring boot·后端·权限管理·rbac
ray_liang14 小时前
吐血整理JSON-RPC2.0的原理与应用
后端
蝎子莱莱爱打怪14 小时前
Claude Code 省 Token 小妙招:RTK + Caveman 组合拳
前端·人工智能·后端