C#中反射的原理介绍及常见的应用场景介绍

反射(Reflection)是C#中的一种机制,允许程序在运行时获取类型信息并动态调用其成员。通过反射,程序可以访问程序集、模块、类型及其成员(如方法、属性、字段等),并能在运行时创建对象、调用方法或访问属性。

反射的核心类是 System.Type,它表示类型声明(类、接口、数组、值类型等)。通过 Type 对象,可以获取类型的详细信息并执行相关操作。

反射的主要功能
  1. 获取类型信息:通过 typeof 或 GetType() 获取 Type 对象。

  2. 动态创建对象:使用 Activator.CreateInstance 方法。

  3. 调用方法:通过 MethodInfo 调用方法。

  4. 访问字段和属性:通过 FieldInfo 和 PropertyInfo 访问字段和属性。

  5. 加载程序集:使用 Assembly.Load 或 Assembly.LoadFrom 加载程序集。

反射的常见应用

  1. 插件系统

    • 通过反射动态加载程序集并调用其中的类型和方法,常用于插件架构。

    csharp

    Assembly pluginAssembly = Assembly.LoadFrom("MyPlugin.dll");
    Type pluginType = pluginAssembly.GetType("MyPlugin.MyClass");
    object pluginInstance = Activator.CreateInstance(pluginType);
    MethodInfo method = pluginType.GetMethod("DoWork");
    method.Invoke(pluginInstance, null);

  2. 依赖注入

    • 反射用于在依赖注入容器中动态创建和注入对象。

    csharp

    Type serviceType = typeof(MyService);
    object serviceInstance = Activator.CreateInstance(serviceType);

  3. 序列化和反序列化

    • 反射用于在序列化和反序列化过程中访问对象的属性和字段。

    csharp

    foreach (PropertyInfo prop in obj.GetType().GetProperties())
    {
        Console.WriteLine($"{prop.Name}: {prop.GetValue(obj)}");
    }

  4. ORM框架

    • 反射用于对象关系映射(ORM)框架中,动态读取和设置数据库记录的属性。

    csharp

    foreach (var prop in entity.GetType().GetProperties())
    {
        prop.SetValue(entity, reader[prop.Name]);
    }

  5. 单元测试

    • 反射用于单元测试框架中,动态调用私有方法和访问私有字段。

    csharp

    MethodInfo privateMethod = typeof(MyClass).GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
    privateMethod.Invoke(myClassInstance, null);

  6. 动态代理

    • 反射用于创建动态代理对象,拦截方法调用并执行额外逻辑。

    csharp

    public class DynamicProxy : DispatchProxy
    {
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            Console.WriteLine($"Before {targetMethod.Name}");
            var result = targetMethod.Invoke(target, args);
            Console.WriteLine($"After {targetMethod.Name}");
            return result;
        }
    }

反射的优缺点

优点
  • 灵活性:允许在运行时动态操作类型和对象。

  • 扩展性:支持插件和模块化设计。

缺点
  • 性能开销:反射操作通常比直接代码调用慢。

  • 安全性:可能绕过访问控制,带来安全隐患。

  • 复杂性:代码可读性和维护性较差。

总结

反射是C#中强大的机制,适用于需要动态类型操作的场景,如插件系统、依赖注入等。尽管灵活,但需注意其性能和安全问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可信数据空间 X 大模型,实践场景案例分享

近期,国家数据局发布《可信数据空间发展行动计划(2024—2028年)》,这是国家层面首次针对可信数据空间这一新型数据基础设施进行前瞻性的系统布局。可信数据空间,是一类全新的数据流通利用基础设施,同时也是…

Java-数据结构-(HashMap HashSet)

一、Tree和Hash的区别 在上一篇文章中,我们讲到了"TreeMap"和"TreeSet",但当我们刷题的时候却会发现,实际应用Map和Set时,却常常都只会用"HashMap"和"HashSet",这是为什么呢…

DeepSeek在linux下的安装部署与应用测试

结合上一篇文章,本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型,主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署,Open WebUI官网也提供了完整的docker部署说明,大家可…

ShenNiusModularity项目源码学习(9:项目结构)

ShenNiusModularity源码主要有11个project(其实还有officialweb、test两个文件夹,大致有4、5个project,但看着跟主要项目代码没太大关系,暂时不管),这11个project的依赖关系如下图所示,其中最下…

用deepseek学大模型08-cnn残差网络

残差网络 参考:https://blog.csdn.net/2301_80750681/article/details/142882802 以下是使用PyTorch实现的三层残差网络示例,包含三个残差块和完整的网络结构: import torch import torch.nn as nnclass BasicBlock(nn.Module):expansion…

【C++】36.C++IO流

文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。pri…

#渗透测试#批量漏洞挖掘#Apache Log4j反序列化命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Apache Log4j反序列化命令执行漏洞 一、…

JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测

JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-LSTM-Attention、CNN-LSTM-Attent…

[STM32 - 野火] - - - 固件库学习笔记 - - - 十五.设置FLASH的读写保护及解除

一、选项字节与读写保护 1.1 为什么要设置读写保护 防止内部FLASH中的程序被非法读取。 在实际发布的产品中,STM32芯片的内部FLASH存储了控制程序。然而,如果不对内部FLASH采取任何保护措施,用户可以使用下载器直接读取其内容,并…

【算法与数据结构】字典树(Trie)详解

目录 一,字典树的定义 二,字典树的代码实现 完整代码详细注释: 测试用例测试结果: 三,处理其他字符 四,内存优化与扩展 1. 内存优化 2. 扩展功能 五,扩展功能支持通配符匹配 六&…

MySQL 之存储引擎(MySQL Storage Engine)

MySQL 之存储引擎 常见存储引擎及其特点 ‌InnoDB‌: ‌特点‌:支持事务处理、行级锁定、外键约束,使用聚簇索引,适合高并发读写和事务处理的场景‌。‌适用场景‌:需要高可靠性、高并发读写和事务处理的场景‌。 ‌M…

CXL ALMP(ARB/MUX Link Management Packet)理解

前言: ALMP(ARB/MUX Link Management Packet) 是CXL协议中由ARB/MUX层生成和处理的专用管理报文,用于协调链路电源状态切换(如L0s/L1)和虚拟链路状态机(vLSM)同步。以下是其核心特性…

002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡

前文地址: 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…

计算机网络(3)TCP格式/连接

1、TCP三大特点:面向连接、可靠、基于字节流 2、如何唯一确定一个TCP连接?TCP四元组:源地址、源端口、目的地址、目的端口 源地址和目标地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机源端口和目标端口…

vscode远程报错:Remote host key has changed,...

重装了Ubuntu系统之后,由20.04改为22.04,再用vscode远程,就出现了以上报错。 亲测有效的办法 gedit ~/.ssh/known_hosts 打开这个配置文件 删掉与之匹配的那一行,不知道删哪一行的话,就打开第一行这个 /.ssh/confi…

无符号整数和带符号整数的相互转换

无符号字符数x转换为带符号字符数时,当时,转换后仍然为x;当时,转换后变为。 带符号字符数y转换为无符号字符数时,当时,转换后变为;当时,转换后仍然为y。 无符号整数和带符号整数的…

浏览器报错:无法访问此网站 无法找到xxx.xxx.net的DNS地址。正在诊断该问题。尝试运行Windows网络诊断。DNS_PROBE_STARTED

🤟致敬读者 🟩感谢阅读🟦希望我的文章能帮到您🟪如有兴趣可点关注了解更多内容 📘博主信息 点击标题👆有惊喜 📃文章前言 🔷文章均为学习和工作中整理的笔记,分享记录…

2025-02-18 学习记录--C/C++-PTA 7-25 念数字

一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ /*** 输入一个整数&#xff0c;输出每个数字对应的拼音。当整数为负数时&#xff0c;先输出fu字。*/#include <stdio.h>// 输出 正数 中 各位数 对应的 拼音 void getLetter(int num) {// 10个数字&#x…

VirtualBox 中使用 桥接网卡 并设置 MAC 地址

在 VirtualBox 中使用 桥接网卡 并设置 MAC 地址&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;设置桥接网卡 打开 VirtualBox&#xff0c;选择你的虚拟机&#xff0c;点击 “设置” (Settings)。进入 “网络” (Network) 选项卡。在 “适配器 1” (Adapt…

Fiddler笔记

文章目录 一、与F12对比二、核心作用三、原理四、配置1.Rules:2.配置证书抓取https包3.设置过滤器4、抓取App包 五、模拟弱网测试六、调试1.线上调试2.断点调试 七、理论1.四要素2.如何定位前后端bug 注 一、与F12对比 相同点&#xff1a; 都可以对http和https请求进行抓包分析…