C# 反射
原文链接:https://www.cnblogs.com/ysmc/p/18802677
介绍(摘抄网络)
C# 中的反射是一个强大的功能,它允许程序在运行时检查和操作对象的类型信息。通过反射,可以动态地创建对象、调用方法、访问字段和属性,甚至是私有的成员。这一特性在需要编写灵活和动态代码的场景下非常有用,比如插件系统、序列化操作、依赖注入框架等。
反射的关键类和命名空间
反射功能主要通过 System.Reflection
命名空间中的类来实现,以下是一些核心的类:
Type
:表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义以及开放或封闭的构造泛型类型。MethodInfo
、ConstructorInfo
、FieldInfo
、PropertyInfo
等:表示相应的成员信息,并提供了用于访问成员元数据的方法。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#类型系统有深入的理解。
本文来自博客园,作者:一事冇诚,转载请注明原文链接:https://www.cnblogs.com/ysmc/p/18802677