C# 里反射(Reflection)的應用說明

server/2024/10/17 20:07:03/

一、反射的基本概念

在C#编程中,反射(Reflection)是一个强大的工具,它允许程序在运行时检查对象或类型的元数据,并动态地创建和操作这些对象。反射是.Net框架提供的一种机制,使得开发者能够在不直接知道类型的情况下,对类型进行各种操作。

二、反射的优缺点

2.1优点:

2.1.1反射提高了程序的灵活性和扩展性;

2.1.2降低耦合性,提高自适应能力;

2.1.3它允许程序创建和控制任何类的对象,无需提前硬编码目标类;

2.2缺点:

2.2.1性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

2.2.2使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

三、反射的主要用途

  • 检查对象类型:能够检查任何对象的类型。
  • 动态创建实例:可以动态创建类的实例。
  • 获取和设置属性和字段:能够在运行时获取或修改属性和字段的值。
  • 动态调用方法:可以动态调用对象的方法。
  • 程序集和模块操作:可以加载和分析程序集和模块。
  • 自定义特性处理:反射允许读取自定义特性。

四.使用C#反射的常见场景和代码示例

4.1使用反射动态创建类型的实例:

using System;
using System.Reflection;public class MyClass
{public MyClass(){Console.WriteLine("MyClass 实例被创建");}
}class Program
{static void Main(string[] args){// 获取 Assembly 对象Assembly assembly = Assembly.GetExecutingAssembly();// 通过 Type 的 FullName 获取 Type 对象Type myType = assembly.GetType("MyClass");// 使用 Activator.CreateInstance 创建 MyClass 的实例object myClassInstance = Activator.CreateInstance(myType);}
}

4.2使用反射获取和调用方法: 

using System;
using System.Reflection;public class MyClass
{public void MyMethod(){Console.WriteLine("MyMethod 被调用");}
}class Program
{static void Main(string[] args){// 获取 Assembly 对象Assembly assembly = Assembly.GetExecutingAssembly();// 通过 Type 的 FullName 获取 Type 对象Type myType = assembly.GetType("MyClass");// 创建 MyClass 的实例object myClassInstance = Activator.CreateInstance(myType);// 获取方法信息MethodInfo methodInfo = myType.GetMethod("MyMethod");// 调用方法methodInfo.Invoke(myClassInstance, null);}
}

4.3使用反射获取和设置字段值:

using System;
using System.Reflection;public class MyClass
{public int myField = 10;
}class Program
{static void Main(string[] args){// 获取 Assembly 对象Assembly assembly = Assembly.GetExecutingAssembly();// 通过 Type 的 FullName 获取 Type 对象Type myType = assembly.GetType("MyClass");// 创建 MyClass 的实例object myClassInstance = Activator.CreateInstance(myType);// 获取字段信息FieldInfo fieldInfo = myType.GetField("myField");// 获取字段值int fieldValue = (int)fieldInfo.GetValue(myClassInstance);Console.WriteLine("字段值为: " + fieldValue);// 设置字段值fieldInfo.SetValue(myClassInstance, 20);Console.WriteLine("设置后的字段值为: " + (int)fieldInfo.GetValue(myClassInstance));}
}


五.总结

反射是C#编程中一种强大的工具,它允许程序在运行时检查对象或类型的元数据,并动态地创建和操作这些对象。通过反射,我们可以检查对象类型、动态创建实例、获取和设置属性和字段、动态调用方法等。然而,反射也有一些缺点,包括性能问题和安全性风险。因此,在使用反射时,需要权衡其带来的好处和潜在的负面影响,并采取相应的优化和安全措施来降低这些风险。

 


http://www.ppmy.cn/server/132567.html

相关文章

深度学习:领域适应(Domain Adaptation)详解

领域适应(Domain Adaptation)详解 领域适应是机器学习中的一个重要研究领域,它解决的问题是模型在一个领域(源域)上训练得到的知识如何迁移到另一个有所差异的领域(目标域)上。领域适应特别重要…

OpenCV-人脸检测

文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了多种人脸检测方法,以下是对OpenCV人脸检测的详细介绍: 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…

Spring Security自定义登录接口处理JSON请求体

Spring Security自定义登录接口处理JSON请求体 一、Spring Security自定义登录接口处理JSON请求体1. 创建自定义登录控制器2. 创建LoginRequest类3. 配置Spring Security 一、Spring Security自定义登录接口处理JSON请求体 在Spring Security中,默认情况下&#xf…

Vue3+TypeScript+AntVX6实现Web组态(从技术层面与实现层面进行分析)内含实际案例教学

摘要 用Vue3TypeScriptAntVX6实现Web组态(从技术层面与实现层面进行分析),包含画布创建、节点设计、拖拽实现(实际案例)、节点连线、交互功能,后续文章持续更新。 注:本文章可以根据目录进行导…

Golang Slice扩容机制及注意事项

Golang Slice扩容机制及注意事项: 在 Go语言中,Slice(切片)是一种非常灵活且强大的数据结构,它是对数组的抽象,提供了动态数组的功能。Slice 的扩容机制是自动的,但了解其背后的原理对于编写高…

Qt-系统QThread多线程介绍使用(62)

目录 描述 相关函数 使用 准备工作 重写run 发送信号 创建一个线程 启动线程 计时器运行流程 多线程运用场景 描述 qt多线程和Linux多线程类似 Linux有自己的一套多线程 API,Qt 也有着自己封装的多线程 API QT多线程参考了JAVA中的设计方式 QThread创建…

云服务器磁盘满了,清理docker无用缓存、容器等清理

docker system prune 命令用于清理 Docker 系统中的各种未使用资源。根据你提供的警告信息,这条命令将会移除以下内容: 所有已停止的容器(all stopped containers) 所有未被至少一个容器使用的网络(all networks no…

AI赋能安全运营 | 赛宁网安深度参与四川省网络安全沙龙

为促进四川省、市网络安全公共服务领域的经验交流与深入探讨,打通网络安全供需上下游,加速汇聚省、市优质网络安全设备和服务资源,提升巴中市乃至四川省网络安全防护水平,共同推动四川省网络安全事业的蓬勃发展。 2024年10月15日…