反射----动态调用方法

View Code
 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Type typePerson = typeof(Person);
 6             object obj = 
 7                 Activator.CreateInstance(typePerson);
 8             //获得Person类的Age属性的描述,和某个对象无关系
 9             PropertyInfo propAge = 
10                 typePerson.GetProperty("Age");
11             //第一个参数为要为哪个对象的Age属性赋值。
12             propAge.SetValue(obj, 30,null);
13 
14             PropertyInfo propName =
15                 typePerson.GetProperty("Name");
16             propName.SetValue(obj, "tom", null);
17 
18             //NHibernate、asp.net MVC
19 
20             //Property:属性
21             //Field:字段
22             //Method:方法
23             //Event:事件
24 
25             MethodInfo methodSayHello =
26                 typePerson.GetMethod("SayHello");
27             methodSayHello.Invoke(obj, null);
28 
29 
30             Console.ReadKey();
31         }
32     }
33 
34     class Person
35     {
36         public int Age { get; set; }
37         public string Name { get; set; }
38         public void SayHello()
39         {
40             Console.WriteLine("我叫{0},我{1}岁");
41         }
42     }
•使用Person类进行测试。
•调用Type的GetProperty方法可以根据属性名获得属性对象PropertyInfo,主要成员:CanRead、CanWrite、PropertyType属性类型;SetValue、GetValue:读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最后一个参数null。type.GetProperty(“Age”).SetValue(p1, 30, null),Type、MethodInfo都是和具体对象不相关的,所以需要第一个参数指定要执行的对象。
•调用Type的GetMethod方法可以根据方法名获得方法对象MethodBase,调用MethodBase 的Invoke方法就可以调用方法,第一个参数是实例对象,第二个参数是参数数组,如果没有参数设置为null。对Age不能SetValue(p1,"20",null)
•GetMethod方法默认一个string参数的方法只能获得没有重载方法的方法,要获得重载方法要用GetMethod(string name, Type[] types)这个重载函数,第二个参数是匹配方法的参数类型数组。
•Type类还有很多方法:GetConstructor(获得构造函数)、GetEvent(获得事件)、GetProperties(获得所有属性)等。(*)
•哪里动态了?
 
posted @ 2013-03-18 14:41  Big.Eagle  阅读(161)  评论(0)    收藏  举报