写程序时遇到的情况:需要本地化的数据作为类的静态属性,而数据的本地值是通过Key-Value的方式储存在资源里的,这时候就需要根据Key(字符串,储存属性名称)定位到对应的静态属性,于是就需要用到反射了。
反射首先需要获取这个对象的类型(Type),可以使用 typeof 或者 GetType方法,然后通过该类型(Type)的 GetProperty 方法获取某个属性的属性信息(PropertyInfo),这个方法接收一个字符串参数指明这个属性的名称,在上面的场景里,也就是传入Key,这样就能获取那个属性的信息了。到这里为止,所得到的都和类的实例无关。
之后通过属性信息(PropertyInfo)的 GetValue/SetValue 两个方法就能通过反射获取/修改某个类的实例的属性值,这两个方法都接收一个 Object 参数,指向要修改的类的实例(如果是 SetValue 则还需要接受另一个 Object 参数指定新的属性值)。如果要获取/修改的属性是类的静态属性,则无需传入实例(即传入 null 即可)。
以静态属性为例:
using System; using System.Reflection; namespace ReflectionExample { class ExampleClass { public static string name { get; set; } = "test"; } class Program { static void Main(string[] args) { Type type = typeof(ExampleClass); string propertyName = "name"; string value = ""; if ((type != null) && (propertyName != null)) { PropertyInfo property = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Static); if (property == null) { throw new InvalidOperationException(); } if (property.PropertyType != typeof(string)) { throw new InvalidOperationException(); } value = (string)property.GetValue(null); } Console.WriteLine(value); } } }
C#的反射支持字段、属性、方法和特性(Attribute),这里只是以属性为例,其他的可参考MSDN。