当前位置:首页 > C# > 正文

C#反射详解(从零开始掌握反射创建实例与调用方法)

在 C# 编程中,反射(Reflection) 是一个非常强大的特性。它允许程序在运行时检查类型信息、创建对象实例,并动态调用方法。本教程将带你从零开始,详细讲解如何使用 C# 反射来创建实例调用方法,即使是编程小白也能轻松上手。

C#反射详解(从零开始掌握反射创建实例与调用方法) C#反射 反射创建实例 C#调用方法 动态调用方法 第1张

什么是 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} 岁。");    }}  

现在,我们想通过反射来创建这个类的实例。以下是两种常见方式:

1. 使用无参构造函数创建实例

// 获取 Person 类型Type personType = typeof(Person);// 使用 Activator.CreateInstance 创建实例(调用无参构造函数)object personInstance = Activator.CreateInstance(personType);// 输出验证Console.WriteLine(((Person)personInstance).Name); // 输出:未知  

2. 使用带参构造函数创建实例

// 获取 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;    }}  

性能提示与最佳实践

虽然反射功能强大,但它比直接调用方法要慢得多。因此,在性能敏感的场景中应谨慎使用。建议:

  • 仅在必要时使用反射(如插件加载、通用框架开发)
  • 缓存 TypeMethodInfo 等反射对象以提高重复调用效率
  • 考虑使用 Delegate.CreateDelegate 将反射调用转换为委托以提升性能

总结

通过本教程,你已经掌握了如何使用 C# 反射创建实例调用方法。这些技能在构建灵活、可扩展的应用程序时非常关键。记住关键词:C#反射反射创建实例C#调用方法动态调用方法,它们是你深入学习 .NET 高级特性的基础。

继续练习吧!尝试用反射操作你自己的类,你会发现 C# 的反射机制远比想象中更有趣。