反射是一种在运行时动态获取程序类型信息的技术,它可以用来查找和操作程序中的类型、成员、属性和方法等。
·以下是一个简单的利用反射查找、创建对象、调用方法、获取/修改属性、字段的示例代码:
using System;
using System.Reflection;
class Program
{
static void Main(string[] args)
{
// 通过反射查找类型
Type type = Type.GetType("Demo.Person");
// 通过反射创建对象
object person = Activator.CreateInstance(type);
// 通过反射调用方法
MethodInfo methodInfo = type.GetMethod("SayHello");
methodInfo.Invoke(person, null);
// 通过反射获取属性
PropertyInfo propertyInfo = type.GetProperty("Name");
Console.WriteLine("Name: {0}", propertyInfo.GetValue(person));
// 通过反射修改属性
propertyInfo.SetValue(person, "Tom", null);
Console.WriteLine("Name: {0}", propertyInfo.GetValue(person));
// 通过反射获取字段
FieldInfo fieldInfo = type.GetField("Age");
Console.WriteLine("Age: {0}", fieldInfo.GetValue(person));
// 通过反射修改字段
fieldInfo.SetValue(person, 20);
Console.WriteLine("Age: {0}", fieldInfo.GetValue(person));
}
}
class Person
{
public string Name { get; set; }
public int Age;
public void SayHello()
{
Console.WriteLine("Hello, my name is {0}.", Name);
}
}
在这个示例中,我们通过反射查找了一个名为Demo.Person的类型,并创建了一个该类型的对象。然后,我们使用反射获取了该对象的SayHello方法,并通过Invoke方法调用了该方法。接着,我们使用反射获取了该对象的Name属性,并获取了该属性的值。然后,我们通过反射修改了该对象的Name属性的值,并再次获取了该属性的值。最后,我们使用反射获取了该对象的Age字段,并获取了该字段的值。然后,我们通过反射修改了该对象的Age字段的值,并再次获取了该字段的值。
·使用反射调用构造器,可以通过以下步骤实现:
通过Type.GetType方法或者typeof关键字获取目标类型的Type对象。例如,获取Demo.Person类型的Type对象可以使用以下代码:Type type = Type.GetType("Demo.Person"); 或者 Type type = typeof(Demo.Person);
使用Type.GetConstructor方法获取目标类型的构造器。该方法接受一个Type[]参数,用于指定构造器的参数类型。如果要调用无参数构造器,可以使用Type.GetConstructor(Type.EmptyTypes)方法。例如,获取Demo.Person类型的无参数构造器可以使用以下代码:ConstructorInfo constructor = type.GetConstructor(Type.EmptyTypes);
使用ConstructorInfo.Invoke方法调用构造器。该方法接受一个object[]参数,用于指定构造器的参数值。如果调用无参数构造器,该参数可以传入null或者空数组。例如,调用Demo.Person类型的无参数构造器可以使用以下代码:object person = constructor.Invoke(null);
完整示例代码如下:
using System;
using System.Reflection;
class Program
{
static void Main(string[] args)
{
// 获取类型
Type type = typeof(Demo.Person);
// 获取构造器
ConstructorInfo constructor = type.GetConstructor(Type.EmptyTypes);
// 调用构造器
object person = constructor.Invoke(null);
// 调用对象方法
MethodInfo methodInfo = type.GetMethod("SayHello");
methodInfo.Invoke(person, null);
}
}
class Person
{
public void SayHello()
{
Console.WriteLine("Hello, I'm a new person.");
}
}
在这个示例中,我们使用Type.GetConstructor(new Type[] { typeof(string), typeof(int) })获取了Demo.Person类型的接受string和int类型参数的构造器,并使用ConstructorInfo.Invoke(new object[] { "Tom", 20 })方法调用该构造器,创建了一个带有Name和Age属性的Demo.Person类型的对象。
·Activator.CreateInstance和constructor.Invoke都可以用于创建对象,但它们的实现方式有所不同。
Activator.CreateInstance是一个静态方法,它使用指定的类型名、程序集名、参数等信息来创建一个实例。它可以自动选择适当的构造函数进行创建,并且支持泛型类型的创建。使用Activator.CreateInstance可以避免手动获取构造函数的过程,让创建对象的过程更加简便。但是,由于其通过字符串来指定类型名和程序集名,因此需要在编译时指定完整的类型名和程序集名,不太方便动态获取类型。
constructor.Invoke则是使用反射获取到一个构造函数后,通过Invoke方法来调用构造函数,创建一个对象。与Activator.CreateInstance相比,使用constructor.Invoke需要手动获取构造函数,需要明确指定构造函数的参数,因此相对来说更加复杂。但是,它可以在运行时动态获取类型和构造函数,更加灵活。
总的来说,Activator.CreateInstance适用于已知类型名和程序集名的情况,可以让创建对象更加简便;而constructor.Invoke适用于需要动态获取类型和构造函数的情况,更加灵活。
标签:反射,Invoke,获取,C#,Person,person,Type From: https://www.cnblogs.com/johnyang/p/17205535.html