反射复习(Reflection)
C#的反射是一个比较基础的知识,尤其是在2.0以及后续的版本上,反射的应用更是常见,也成为了许多其他技术/思想的实现基础,尤其是在设计模式中,像策略模式,工厂模式等。下面是一个非常简单的反射例子。
首先定义一个 Person 类
namespace Reflection { class Person { public string Name { get; set; } public int Age { get; set; } public Sex sex { get; set; } public Person(string name,int age,Sex s) { Name = name; Age = age; sex = s; } public void SayHello() { Console.WriteLine("Hello, I am {0}",Name); Console.ReadKey(); } } enum Sex { male, female } }
然后要动态的创建这个Person类的实例,注意,这次我们并不是 new ,而是通过反射来创建这个 Person 类的实例。
创建这个实例这可以用下面这句,因为Person的构造是必须传入参数的,所以要传递初始值。
Type t = typeof(Person);
Object obj = Activator.CreateInstance(t, new Object[] { "Jerry", 30, Sex.male });
这样就创建了一个 Person 类的实例。
下一步可以动态的来修改 Name 属性的值:
PropertyInfo p_name = obj.GetType().GetProperty("Name");
if (p_name != null && p_name.CanRead) {
p_name.SetValue(obj, "Jonathan", null);
}
最后,可以调用创建实例的方法:
MethodInfo m = obj.GetType().GetMethod("SayHello");
m.Invoke(obj,null);
完整代码如下:
namespace Reflection { class Program { static void Main(string[] args) { Type t = typeof(Person); Object obj = Activator.CreateInstance(t, new Object[] { "Jerry", 30, Sex.male }); PropertyInfo p_name = obj.GetType().GetProperty("Name"); if (p_name != null && p_name.CanRead) { p_name.SetValue(obj, "Jonathan", null); } MethodInfo m = obj.GetType().GetMethod("SayHello"); m.Invoke(obj,null); } } }
这里只是简单的复习了一下反射的基础知识。