C# 反射获取到类型object的变量

在C#中,反射是一种强大的技术,它允许在运行时检查和操作对象和类型的信息。通过反射,可以获取类型的详细信息,例如属性、方法、字段等。这里详细介绍如何使用反射获取一个类型的object变量,并访问其成员。

示例代码

假设我们有一个简单的类:

csharp
public class Person { public string Name { get; set; } public int Age { get; set; } public void SayHello() { Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old."); } }

我们将使用反射来创建这个类的实例,并访问它的属性和方法。

获取类型信息

使用反射获取类型信息的第一步是获取Type对象。有几种方法可以做到这一点:

  1. 使用类型名:

    csharp
    Type personType = typeof(Person);
  2. 使用对象的实例:

    csharp
    Person person = new Person(); Type personType = person.GetType();
  3. 使用类型的完全限定名(如果类型在不同的程序集或命名空间中):

    csharp
    Type personType = Type.GetType("Namespace.Person, AssemblyName");

创建实例

使用反射创建类型的实例:

csharp
object personInstance = Activator.CreateInstance(personType);

访问属性

通过反射访问和设置属性:

csharp
// 获取属性 PropertyInfo nameProperty = personType.GetProperty("Name"); PropertyInfo ageProperty = personType.GetProperty("Age"); // 设置属性值 nameProperty.SetValue(personInstance, "John Doe"); ageProperty.SetValue(personInstance, 30); // 获取属性值 string name = (string)nameProperty.GetValue(personInstance); int age = (int)ageProperty.GetValue(personInstance); Console.WriteLine($"Name: {name}, Age: {age}");

调用方法

通过反射调用方法:

csharp
// 获取方法 MethodInfo sayHelloMethod = personType.GetMethod("SayHello"); // 调用方法 sayHelloMethod.Invoke(personInstance, null);

完整示例

以下是完整的代码示例,将上述所有步骤结合在一起:

csharp
using System; using System.Reflection; public class Person { public string Name { get; set; } public int Age { get; set; } public void SayHello() { Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old."); } } public class Program { public static void Main() { // 获取类型信息 Type personType = typeof(Person); // 创建实例 object personInstance = Activator.CreateInstance(personType); // 访问属性并设置值 PropertyInfo nameProperty = personType.GetProperty("Name"); PropertyInfo ageProperty = personType.GetProperty("Age"); nameProperty.SetValue(personInstance, "John Doe"); ageProperty.SetValue(personInstance, 30); // 获取属性值并打印 string name = (string)nameProperty.GetValue(personInstance); int age = (int)ageProperty.GetValue(personInstance); Console.WriteLine($"Name: {name}, Age: {age}"); // 调用方法 MethodInfo sayHelloMethod = personType.GetMethod("SayHello"); sayHelloMethod.Invoke(personInstance, null); } }

解释

  1. 获取类型信息:通过typeof(Person)获取Type对象。
  2. 创建实例:使用Activator.CreateInstance创建Person类型的实例。
  3. 访问属性:通过GetProperty方法获取属性信息,并使用SetValueGetValue方法设置和获取属性值。
  4. 调用方法:通过GetMethod方法获取方法信息,并使用Invoke方法调用方法。

这样,你可以在运行时动态地操作对象及其成员,充分利用反射的强大功能。