C# 反射

原文链接:https://www.cnblogs.com/ysmc/p/18802677

介绍(摘抄网络)

C# 中的反射是一个强大的功能,它允许程序在运行时检查和操作对象的类型信息。通过反射,可以动态地创建对象、调用方法、访问字段和属性,甚至是私有的成员。这一特性在需要编写灵活和动态代码的场景下非常有用,比如插件系统、序列化操作、依赖注入框架等。

反射的关键类和命名空间

反射功能主要通过 System.Reflection 命名空间中的类来实现,以下是一些核心的类:

  • Type:表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义以及开放或封闭的构造泛型类型。
  • MethodInfoConstructorInfoFieldInfoPropertyInfo 等:表示相应的成员信息,并提供了用于访问成员元数据的方法。
  • Activator:提供了创建类型实例的方法,包括使用参数创建实例和访问无参构造函数的能力。

反射的使用

以下是一些使用反射的示例:

获取类型信息

1 var type = typeof(MyClass); // 通过类型名获取类型信息
2 var sameType = myObject.GetType(); // 通过对象实例获取类型信息
3 Console.WriteLine(type.FullName); // 输出类型的完全限定名

创建对象实例

1 var type = typeof(MyClass);
2 var myInstance = (MyClass)Activator.CreateInstance(type);

调用方法

1 var methodInfo = type.GetMethod("MyMethod");
2 methodInfo.Invoke(myInstance, new object[] { /* 方法参数 */ });

读取和设置字段或属性

1 var fieldInfo = type.GetField("myField", BindingFlags.NonPublic | BindingFlags.Instance);
2 var fieldValue = fieldInfo.GetValue(myInstance); // 获取字段值
3 fieldInfo.SetValue(myInstance, newValue); // 设置新的字段值
4 
5 var propertyInfo = type.GetProperty("MyProperty");
6 var propertyValue = propertyInfo.GetValue(myInstance); // 获取属性值
7 propertyInfo.SetValue(myInstance, newValue); // 设置新的属性值

反射的优点和缺点

优点

  • 灵活性:允许程序动态地创建和操作对象,而不需要在编译时知道具体的类型。
  • 强大的功能:可以访问类型的所有信息,包括私有成员。
  • 适用性:特别适用于需要大量动态行为的应用程序,如框架开发、插件系统等。

缺点

  • 性能开销:反射操作通常比直接代码访问要慢,因为涉及到动态类型信息的查询和操纵。
  • 安全性:允许绕过正常的访问限制,例如修改私有字段,这可能会导致代码更加难以理解和维护。
  • 复杂性:正确使用反射需要对C#类型系统有深入的理解。
posted @ 2025-03-31 18:12  一事冇诚  阅读(5968)  评论(0)    收藏  举报