C#中的反射(System.Reflection)

下面是针对“C#中的反射(System.Reflection)”的完整攻略。

什么是反射

反射是一种在运行时获取类型信息和操作对象的方法。它允许程序在运行时发现和调用在编译时未知的类型、方法和属性。利用反射,您可以:

  • 获取程序集、模块和类型的元数据
  • 创建类型的实例、操作成员、获取在许多情况下是编译时未知的属性和字段值

反射在许多场合被使用,如:

  • 在运行时加载和操作程序集,如插件等
  • 使用反射实现ORM等框架
  • 在调试器、动态编译器等工具中使用反射以产生代码和元数据分析等

反射基本应用

要在C#中使用一些反射功能,需要导入System.Reflection命名空间。下面是几个基本应用实例。

获取类型信息

获取一个对象的类型信息:

object obj = new object();
Type t = obj.GetType();

获取一个类型的实例:

Type t = typeof(string);

获取类型的元数据和操作类成员

这里演示通过反射获取和操作一些类成员

public class Person {
    public string Name {get;set;}
    private int age;
    public int GetAge() {return age;}
}

Type t = typeof(Person);
PropertyInfo pinfo = t.GetProperty("Name");
MethodInfo minfo = t.GetMethod("GetAge");

Console.WriteLine(pinfo.PropertyType);
Console.WriteLine(pinfo.GetValue(personObj));
Console.WriteLine(minfo.Invoke(personObj, null));

创建对象实例和操作属性/字段

使用反射可以创建任何类型的实例,甚至是动态创建类型:

Type t = Type.GetType("System.String");
object obj = Activator.CreateInstance(t, new object[] { "hello" });

Type t2 = typeof(Person);
object personObj = Activator.CreateInstance(t2);
PropertyInfo pinfo = t2.GetProperty("Name");
pinfo.SetValue(personObj, "Lucy");

动态调用方法

可以通过 MethodInfo 的 Invoke 方法动态调用任何方法:

Type t = typeof(Math);
MethodInfo minfo = t.GetMethod("Abs", new Type[]{typeof(int)});
int result = (int) minfo.Invoke(null, new object[]{ -5 });

这里使用反射调用Math的静态方法 Abs。

总结

反射是C#中很有用的特性,允许程序在运行时获取类型信息和操作对象。反射广泛应用于插件、ORM、调试器等许多领域。在使用反射时,需要使用 System.Reflection 命名空间和一些基本的反射类型,如 Type、MethodInfo 等,只有理解了这些反射内容,才能更好地掌握反射技术的高级应用。

营销型网站