反射复习(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);
        }
    }
}

这里只是简单的复习了一下反射的基础知识。

posted @ 2009-04-08 11:31  老姜  阅读(377)  评论(0编辑  收藏  举报