C# 反射获取到类型object的变量
在C#中,反射是一种强大的技术,它允许在运行时检查和操作对象和类型的信息。通过反射,可以获取类型的详细信息,例如属性、方法、字段等。这里详细介绍如何使用反射获取一个类型的object
变量,并访问其成员。
示例代码
假设我们有一个简单的类:
csharppublic 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
对象。有几种方法可以做到这一点:
使用类型名:
csharpType personType = typeof(Person);
使用对象的实例:
csharpPerson person = new Person(); Type personType = person.GetType();
使用类型的完全限定名(如果类型在不同的程序集或命名空间中):
csharpType personType = Type.GetType("Namespace.Person, AssemblyName");
创建实例
使用反射创建类型的实例:
csharpobject 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);
完整示例
以下是完整的代码示例,将上述所有步骤结合在一起:
csharpusing 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);
}
}
解释
- 获取类型信息:通过
typeof(Person)
获取Type
对象。 - 创建实例:使用
Activator.CreateInstance
创建Person
类型的实例。 - 访问属性:通过
GetProperty
方法获取属性信息,并使用SetValue
和GetValue
方法设置和获取属性值。 - 调用方法:通过
GetMethod
方法获取方法信息,并使用Invoke
方法调用方法。
这样,你可以在运行时动态地操作对象及其成员,充分利用反射的强大功能。