网络技术知识
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 等,只有理解了这些反射内容,才能更好地掌握反射技术的高级应用。