当前位置: 首页 > news >正文

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

一、反射的基本概念

在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.mrgr.cn/news/52334.html

相关文章:

  • 并查集算法
  • 一站式讲解Wireshark网络抓包分析的若干场景、过滤条件及分析方法
  • 深入探索 C++ STL: 高效双向链表 list 的使用与实践
  • 【数据结构】在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径
  • 兰迪·舍克曼担任生命银行链(LBC)顾问,赋能基因数据技术发展
  • 【C++刷题】力扣-#170-两数之和III-数据结构设计
  • 基础实验4-2.7 修理牧场
  • kernel panic 稳定性分析实例(三)
  • 线性可分支持向量机的原理推导
  • Shell编程-for循环
  • 【存储设备专栏 2.8 -- gio mount -d /dev/sdb1 挂载U盘后查看挂载的目录】
  • 2024年推荐的7个自助建站工具?
  • 深度学习笔记20_数据增强
  • 一文详解 requests 库中 json 参数和 data 参数的用法
  • 最强小模型又易主!Mistral发布小部长Ministral 3B、8B,登基边缘计算之王!
  • 玩转Prometheus的pushgateway和联邦集群
  • perl模式匹配修饰符
  • 人工智能学习框架
  • 案例分析:Modbus设备如何通过MQTT网关连接阿里云IoT
  • 【Spark SQL】文本函数及业务场景使用