C# 反射是指在运行时动态地获取类型信息并操作对象的能力。通过反射,我们可以在运行时获取一个类型的成员信息(如字段、属性、方法等),并且可以动态地创建对象、调用方法、设置属性等。
1.释义
C# 反射是指在运行时动态地获取程序集、类型、成员等信息的能力。通过反射,我们可以在运行时获取类型的信息,创建对象、调用方法、访问属性等。
C# 反射提供了以下几个核心类:
1. Assembly:表示一个程序集,可以通过该类获取程序集的信息。
2. Type:表示一个类型,可以通过该类获取类型的信息。
3. MethodInfo:表示一个方法,可以通过该类获取方法的信息。
4. PropertyInfo:表示一个属性,可以通过该类获取属性的信息。
5. FieldInfo:表示一个字段,可以通过该类获取字段的信息。
使用 C# 反射可以实现很多高级功能,比如动态加载程序集、动态创建对象、动态调用方法等。但是反射的使用也会带来一些性能上的损失,因此在实际开发中需要谨慎使用。
2.实例
下面是一个简单的示例,演示如何使用反射来创建一个对象、调用它的方法并设置它的属性:
```csharp
using System;
using System.Reflection;
class Program
{
static void Main(string[] args)
{
// 获取类型信息
Type type = typeof(MyClass);
// 创建对象
object obj = Activator.CreateInstance(type);
// 调用方法
MethodInfo method = type.GetMethod("SayHello");
method.Invoke(obj, null);
// 设置属性
PropertyInfo property = type.GetProperty("Name");
property.SetValue(obj, "Tom", null);
// 输出属性值
Console.WriteLine(property.GetValue(obj, null));
}
}
class MyClass
{
public string Name { get; set; }
public void SayHello()
{
Console.WriteLine("Hello, world!");
}
}
```
在上面的示例中,我们首先使用 `typeof` 关键字获取 `MyClass` 类型的信息,然后使用 `Activator.CreateInstance` 方法创建一个 `MyClass` 的实例。接着,我们使用 `GetMethod` 方法获取 `SayHello` 方法的信息,并使用 `Invoke` 方法调用该方法。然后,我们使用 `GetProperty` 方法获取 `Name` 属性的信息,并使用 `SetValue` 方法设置该属性的值。最后,我们使用 `GetValue` 方法获取 `Name` 属性的值,并输出它。
需要注意的是,反射操作会带来一定的性能损失,因此应该尽量避免在性能要求较高的场景中使用反射。