在 C# 编程中,反射(Reflection) 是一个非常强大的特性。它允许程序在运行时检查类型信息、创建对象实例,并动态调用方法。本教程将带你从零开始,详细讲解如何使用 C# 反射来创建实例和调用方法,即使是编程小白也能轻松上手。
反射是 .NET 提供的一种机制,它允许你在程序运行时获取类型(Type)的信息,包括类、方法、属性、字段等。通过反射,你可以在不知道具体类型名称的情况下,动态地创建对象、调用方法或访问属性。这在插件系统、依赖注入框架、ORM 工具等场景中非常有用。
要使用反射功能,你需要在代码顶部引入以下命名空间:
using System;using System.Reflection;
假设我们有一个简单的类 Person:
public class Person{ public string Name { get; set; } public int Age { get; set; } public Person() { Name = "未知"; Age = 0; } public Person(string name, int age) { Name = name; Age = age; } public void SayHello() { Console.WriteLine($"你好,我是 {Name},今年 {Age} 岁。"); }} 现在,我们想通过反射来创建这个类的实例。以下是两种常见方式:
// 获取 Person 类型Type personType = typeof(Person);// 使用 Activator.CreateInstance 创建实例(调用无参构造函数)object personInstance = Activator.CreateInstance(personType);// 输出验证Console.WriteLine(((Person)personInstance).Name); // 输出:未知
// 获取 Person 类型Type personType = typeof(Person);// 指定参数类型Type[] constructorArgs = new Type[] { typeof(string), typeof(int) };// 获取对应的构造函数ConstructorInfo constructor = personType.GetConstructor(constructorArgs);// 调用构造函数并传入实际参数object personInstance = constructor.Invoke(new object[] { "张三", 25 });// 输出验证Console.WriteLine(((Person)personInstance).Name); // 输出:张三 创建好实例后,我们可以使用反射来调用它的方法。例如,调用 SayHello 方法:
// 假设 personInstance 已经通过上面的方式创建// 获取 SayHello 方法MethodInfo sayHelloMethod = personType.GetMethod("SayHello");// 调用该方法(无参数)sayHelloMethod.Invoke(personInstance, null);// 输出:你好,我是 张三,今年 25 岁。 如果方法有参数,比如我们添加一个新方法:
public void SetInfo(string name, int age){ Name = name; Age = age;} 那么调用方式如下:
// 获取 SetInfo 方法MethodInfo setInfoMethod = personType.GetMethod("SetInfo");// 调用并传入参数setInfoMethod.Invoke(personInstance, new object[] { "李四", 30 }); 下面是一个完整的控制台程序示例,整合了上述所有知识点:
using System;using System.Reflection;class Program{ static void Main() { // 获取类型 Type personType = typeof(Person); // 创建带参实例 ConstructorInfo ctor = personType.GetConstructor(new Type[] { typeof(string), typeof(int) }); object person = ctor.Invoke(new object[] { "王五", 28 }); // 调用 SayHello 方法 MethodInfo sayHello = personType.GetMethod("SayHello"); sayHello.Invoke(person, null); // 调用 SetInfo 方法 MethodInfo setInfo = personType.GetMethod("SetInfo"); setInfo.Invoke(person, new object[] { "赵六", 35 }); // 再次调用 SayHello sayHello.Invoke(person, null); }}public class Person{ public string Name { get; set; } public int Age { get; set; } public Person(string name, int age) { Name = name; Age = age; } public void SayHello() { Console.WriteLine($"你好,我是 {Name},今年 {Age} 岁。"); } public void SetInfo(string name, int age) { Name = name; Age = age; }} 虽然反射功能强大,但它比直接调用方法要慢得多。因此,在性能敏感的场景中应谨慎使用。建议:
Type、MethodInfo 等反射对象以提高重复调用效率Delegate.CreateDelegate 将反射调用转换为委托以提升性能通过本教程,你已经掌握了如何使用 C# 反射 来创建实例和调用方法。这些技能在构建灵活、可扩展的应用程序时非常关键。记住关键词:C#反射、反射创建实例、C#调用方法、动态调用方法,它们是你深入学习 .NET 高级特性的基础。
继续练习吧!尝试用反射操作你自己的类,你会发现 C# 的反射机制远比想象中更有趣。
本文由主机测评网于2025-12-09发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125443.html