C# 反射(Reflection)超全解析

一、反射(Reflection)的清晰定义

反射(Reflection)是 .NET 框架提供的核心运行时机制,它允许程序在运行时而非编译时

  • 获取程序集(Assembly)、模块(Module)、类型(Type)的元数据信息
  • 动态创建对象实例
  • 动态调用方法
  • 动态读取或修改属性/字段
  • 动态解析自定义特性(Attribute)

对比理解

方式特点
普通编码编译期确定类型,直接调用,性能高
反射编程运行期确定类型,动态操作,极度灵活

通俗理解

  • 普通编程:编译期就确定要使用哪个类、调用哪个方法,代码是“写死的”。
  • 反射编程:程序运行时才知道要操作哪个类,通过读取元数据“动态操作类型”。

👉一句话:反射 = 运行时读取元数据 + 动态操作类型


二、.NET 中反射的底层基础

IL 与元数据

  • C# → 编译 →IL(中间语言)
  • 同时生成Metadata(元数据表)(包含类型名、命名空间、成员签名、特性信息等)

反射的本质:

读取程序集中的 Metadata,而不是“反编译源码”


三、反射核心类继承体系与关键成员

1. 核心类继承结构

MemberInfo ├── FieldInfo ├── PropertyInfo ├── MethodBase │ ├── ConstructorInfo │ └── MethodInfo └── EventInfo

MemberInfo是所有“成员描述类”的抽象基类。

2. 各核心类的关键成员(常用)

类名核心父类关键成员作用说明
MemberInfo-Name、GetCustomAttributes()获取成员名称、自定义特性
MethodBaseMemberInfoIsAbstract、IsPublic、IsStatic、Invoke()判断方法特性、调用方法或构造函数
ConstructorInfoMethodBaseInvoke(object[] parameters)调用构造函数创建实例
MethodInfoMethodBaseReturnType、Invoke()获取返回值类型、调用方法
PropertyInfoMemberInfoCanRead、CanWrite、PropertyType、GetValue()、SetValue()获取/设置属性值

四、Type 类深度解析(核心入口)

Type是整个反射体系的入口类,几乎所有反射操作都从它开始。

常用成员

1. 类型判断
  • IsInterfaceIsArrayIsPrimitiveIsEnum
  • IsClassIsPublic
2. 类型信息
  • Name(类型名)、FullName(完整类型名)、BaseType(基类)
3. 类型关系判断
  • IsInstanceOfType(object obj)
  • IsAssignableFrom(Type type)
4. 成员获取
  • GetConstructor(Type[] paramTypes)
  • GetMethod(string name, Type[] paramTypes)
  • GetProperty(string name)

基础示例

Typetype=typeof(Person);Console.WriteLine(type.Name);Console.WriteLine(type.FullName);Console.WriteLine(type.BaseType);Console.WriteLine(type.IsClass);Console.WriteLine(type.IsPublic);

运行结果:

Person ReflectionDemo.Person System.Object True True

五、核心反射类型详解(附示例)

1. MemberInfo

Typetype=typeof(Person);foreach(MemberInfomemberintype.GetMembers()){Console.WriteLine(member.Name+" - "+member.MemberType);}

运行结果示例:

get_Name - Method set_Name - Method SayHi - Method Name - Property

2. MethodInfo(方法反射)

获取并调用无参方法
MethodInfomethod=type.GetMethod("SayHi");method.Invoke(personObj,null);

运行结果:

Hi, my name is chen
调用带参数方法
MethodInfomethod2=type.GetMethod("SayHi",newType[]{typeof(string)});method2.Invoke(personObj,newobject[]{"Tom"});

运行结果:

Hi, Tom

3. ConstructorInfo(构造函数反射)

ConstructorInfoctor=type.GetConstructor(Type.EmptyTypes);objectobj=ctor.Invoke(null);

等价于:

objectobj=Activator.CreateInstance(type);

4. PropertyInfo(属性反射)

PropertyInfoprop=type.GetProperty("Name");// 设置值prop.SetValue(obj,"chen");// 获取值stringname=(string)prop.GetValue(obj);

输出:

chen

六、完整反射综合示例

usingSystem;usingSystem.Reflection;classProgram{staticvoidMain(){Typetype=typeof(Person);// 创建实例objectobj=Activator.CreateInstance(type);// 设置属性PropertyInfoprop=type.GetProperty("Name");prop.SetValue(obj,"chen");// 调用无参方法MethodInfom1=type.GetMethod("SayHi");m1.Invoke(obj,null);// 调用带参方法MethodInfom2=type.GetMethod("SayHi",new[]{typeof(string)});m2.Invoke(obj,newobject[]{"Jack"});}}classPerson{publicstringName{get;set;}publicvoidSayHi(){Console.WriteLine($"Hi, my name is{Name}");}publicvoidSayHi(stringname){Console.WriteLine($"Hi,{name}");}}

运行结果:

Hi, my name is chen Hi, Jack

七、反射实现通用对象拷贝(完整 + 验证)

1. 拷贝方法(浅拷贝)

staticobjectMyClone(objectsource){if(source==null)thrownewArgumentNullException(nameof(source));Typetype=source.GetType();objecttarget=Activator.CreateInstance(type);foreach(PropertyInfopropintype.GetProperties()){if(prop.CanRead&&prop.CanWrite){prop.SetValue(target,prop.GetValue(source));}}returntarget;}

2. 验证代码

Personp1=newPerson{Name="chen",Age=12};Personp2=(Person)MyClone(p1);p2.Name="zhangsan";Console.WriteLine(p1.Name);Console.WriteLine(p2.Name);

运行结果:

chen zhangsan

特点说明

  • ✅ 支持任意对象、不依赖具体类型
  • ❌ 仅实现浅拷贝
  • ❌ 要求目标类型有无参构造函数

八、反射的典型使用场景(工程级)

1. 框架与底层组件

  • ORM(EF Core、Dapper)
  • 依赖注入(Autofac)
  • 序列化(Newtonsoft.Json、System.Text.Json)

2. 插件化架构

  • 动态加载 DLL
  • 运行时发现并执行模块

3. 通用基础工具

  • 对象拷贝
  • 表单/模型验证
  • 通用 Mapper

九、反射的代价、注意事项与优化方案

1. 性能问题

  • 反射 ≈ 普通调用的5~20 倍开销
  • 优化方案:
    • 缓存Type / MethodInfo / PropertyInfo等反射对象
    • 结合表达式树(Expression)优化
    • 使用Delegate.CreateDelegate转为委托调用

2. 封装性破坏

  • 反射可绕过访问修饰符访问私有成员
  • 建议:框架级场景使用,业务层慎用

3. 类型安全

  • 编译期无法校验反射操作的类型正确性
  • 必须做好异常处理(如NullReferenceExceptionMissingMethodException等)

十、总结(工程视角)

  • 反射是 .NET 框架能力的地基,是框架的灵魂
  • 核心入口:Type类;核心成员描述类:MethodInfo / PropertyInfo / ConstructorInfo
  • 优点:高度灵活、解耦,框架开发必备
  • 缺点:性能损耗、类型不安全、破坏封装性
  • 业务代码应“少而精”使用,框架代码必须掌握

反射不是为了偷懒,而是为了“抽象与解耦”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1122368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

思源宋体TTF:5大实战场景如何彻底改变你的设计工作流

思源宋体TTF:5大实战场景如何彻底改变你的设计工作流 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在现代数字设计领域,字体选择直接影响作品的视觉效果和用户…

Mac微信主题美化新篇章:从千篇一律到专属定制

Mac微信主题美化新篇章:从千篇一律到专属定制 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 开启个性化聊天新时代 还在忍…

QMK Toolbox深度解析:从新手到专家的键盘固件刷新神器

QMK Toolbox深度解析:从新手到专家的键盘固件刷新神器 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 还在为复杂的键盘固件刷新过程而头疼吗?QMK Toolbox作为QMK…

Keil下载与虚拟机配置:跨平台开发环境搭建方案

跨平台嵌入式开发实战:在 macOS/Linux 上高效运行 Keil 的完整方案 你有没有遇到过这样的场景?团队统一使用 Keil 开发 STM32 项目,而你的主力机是 MacBook;或者你在用 Linux 做主力开发环境,却因为“ Keil 只能在 W…

米游社自动签到完整配置指南:从零基础到稳定运行

米游社自动签到完整配置指南:从零基础到稳定运行 【免费下载链接】MihoyoBBSTools Womsxd/AutoMihoyoBBS,米游社相关脚本 项目地址: https://gitcode.com/gh_mirrors/mi/MihoyoBBSTools 还在为每天手动登录米游社签到而烦恼?MihoyoBBS…

如何快速上手Lucide图标库:新手完全指南

如何快速上手Lucide图标库:新手完全指南 【免费下载链接】lucide Beautiful & consistent icon toolkit made by the community. Open-source project and a fork of Feather Icons. 项目地址: https://gitcode.com/GitHub_Trending/lu/lucide Lucide图标…

GoB插件终极指南:3分钟打通Blender与ZBrush创作壁垒 [特殊字符]

GoB插件终极指南:3分钟打通Blender与ZBrush创作壁垒 🚀 【免费下载链接】GoB Fork of original GoB script (I just added some fixes) 项目地址: https://gitcode.com/gh_mirrors/go/GoB 还在为Blender和ZBrush之间的模型传输而烦恼吗&#xff1…

Android Studio中文界面深度优化指南:从英文困扰到母语开发体验

Android Studio中文界面深度优化指南:从英文困扰到母语开发体验 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为…

51单片机驱动led阵列汉字显示实验完整示例

51单片机驱动LED阵列汉字显示:从原理到实战的完整实践 你有没有想过,那些街头巷尾滚动播放“开业大吉”“欢迎光临”的红色电子屏,背后其实藏着一个非常经典的嵌入式系统设计?它们的核心技术并不复杂—— 基于51单片机控制的LED点…

3步将手机变身高清摄像头:DroidCam OBS Plugin完整使用指南

3步将手机变身高清摄像头:DroidCam OBS Plugin完整使用指南 【免费下载链接】droidcam-obs-plugin DroidCam OBS Source 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam-obs-plugin 你是否还在为购买昂贵的摄像头而烦恼?现在通过DroidCam…

Lucide图标库:构建现代化应用界面的设计利器

Lucide图标库:构建现代化应用界面的设计利器 【免费下载链接】lucide Beautiful & consistent icon toolkit made by the community. Open-source project and a fork of Feather Icons. 项目地址: https://gitcode.com/GitHub_Trending/lu/lucide Lucid…

思源宋体CN免费开源字体完整应用指南:7款字重专业排版实战

思源宋体CN免费开源字体完整应用指南:7款字重专业排版实战 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 思源宋体CN是由Adobe与Google联合开发的开源中文字体&#xff0c…

Qwen3Guard-Gen-8B是否支持自定义风险标签?扩展性机制解读

Qwen3Guard-Gen-8B是否支持自定义风险标签?扩展性机制解读 在生成式AI快速渗透内容创作、客服系统和社交平台的今天,如何确保大模型输出的安全性,已成为产品设计中不可回避的核心议题。传统基于关键词匹配或规则引擎的内容审核方式&#xff0…

5分钟解锁vJoy虚拟手柄:让键盘鼠标变身专业游戏控制器

5分钟解锁vJoy虚拟手柄:让键盘鼠标变身专业游戏控制器 【免费下载链接】vJoy Virtual Joystick 项目地址: https://gitcode.com/gh_mirrors/vj/vJoy 还在为键盘操作游戏而苦恼?vJoy虚拟手柄驱动正是你需要的解决方案。这个开源项目通过虚拟化技术…

STM32利用QSPI协议实现XIP启动核心要点

STM32如何用QSPI实现XIP启动?一文讲透核心机制与实战要点你有没有遇到过这样的困境:项目功能越做越大,代码体积逼近MCU内部Flash的极限;或者产品要求“上电即用”,但传统搬移式启动动辄几百毫秒延迟?如果你…

QMK Toolbox终极指南:键盘固件刷新的完整解决方案

QMK Toolbox终极指南:键盘固件刷新的完整解决方案 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 想要为你的机械键盘刷写个性化固件,却对复杂的命令行工具望而却…

SharpKeys键盘映射工具:解锁键盘个性化新境界

SharpKeys键盘映射工具:解锁键盘个性化新境界 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys 在数字化工…

精通ImageGlass图像查看器:从基础操作到专业定制的完整指南

精通ImageGlass图像查看器:从基础操作到专业定制的完整指南 【免费下载链接】ImageGlass 🏞 A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 想要提升图片浏览体验?ImageGlass作为一…

AEUX:告别手动复制粘贴,让设计稿秒变动画素材

AEUX:告别手动复制粘贴,让设计稿秒变动画素材 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX 还在为从设计工具到After Effects的繁琐转换而头疼吗?A…

Windows热键冲突终极解决方案:专业级诊断工具完全指南

Windows热键冲突终极解决方案:专业级诊断工具完全指南 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 在日常工作中,你是…