1、反射
背景
今天一同学问我什么是反射,反射有什么作用?
我回答到:反射是让程序员在程序运行周期获得程序集,模块,类的信息
作用:则可以动态的组装配件,动态调用方法,获取属性值...
我也不知道这样回答是否正确,于是我想写个例子让他明白一下
例子产生源由:
TT软件外包公司,LG软件外包公司(声明:虚拟公司)
人物:小眯,LG,TT
一天LG公司接到一个大单,可是人手不够,需要马上加人才能启动项目。
可是临时招人怕来不急,因为项目挺紧的。于是小眯提议去TT公司买人。
现在软件外包人员都是卖来卖去的,呵呵!这个主意不错。我同意了小眯的做法。
在买人过程中,我无意中碰到一个问题,用反射给解决了:
Code
1namespace LGCompany
2{
3 public class ReflectionDemo
4 {
5 public static void Main()
6 {
7 //我先让小眯去问问TT公司的人力资源,看看是否有人卖
8 bool result = TTCompany.CustomerAccess.CallHumanResource("xiaomi");
9
10 //结果
11 if(result)
12 {
13 //续继要小眯去办理此事
14 }
15 else
16 {
17 //小眯跟我说,她们那边没人卖给我们.唉,这可怎么办,我们的项目紧呀,最少差三个人,现在人员不到项目也无法启动呀!没办法,我亲自出马,于是我拔通了TT公司董事的电话
18
19 object[] objList = TTCompany.CustomerAccess.CallTT("LG");
20 //真晕,说给了我三个人,竟然还包装起来.当时急,也没问这三个人的具体情况,这可怎么办,再打电话过去问,有点不好意思吧!
21 //怎么办?
22 //怎么办?
23 //我又无法访问到她们公司人员资料表,看来她们公司对人才管理得很保守
24 //我左想右想,为何不试试反射?对没错,我们就用反射
25
26 foreach(object obj in objList)
27 {
28 Type objType=obj.GetType();
29 PropertyInfo[] propertyList=objType.GetProperties();
30 //我们先看这些人有哪些属性(打印出来)
31 for(int i=0;i<propertyList.Length;i++)
32 {
33 Console.Write("{0}\t",propertyList[i].Name);
34 }
35 Console.WriteLine();
36 //我们再看看这些人属性的值,并打印出来
37 for(int j=0;j<propertyList.Length;j++)
38 {
39 Console.Write("{0}\t",propertyList[j].GetValue(obj,null));
40 }
41 Console.WriteLine();
42 Console.WriteLine();
43 }
44 }
45 Console.ReadKey();
46
47 //哈哈,三个人的基本资料全部出来了,不过好像有点少,TT公司也真是的,人员信息也搞得这么神密,不过看到是信息学院和农业大学的应该不会很烂,,呵呵,我们的项目可以正常启动了!
48
49 }
50 }
51}
1namespace LGCompany
2{
3 public class ReflectionDemo
4 {
5 public static void Main()
6 {
7 //我先让小眯去问问TT公司的人力资源,看看是否有人卖
8 bool result = TTCompany.CustomerAccess.CallHumanResource("xiaomi");
9
10 //结果
11 if(result)
12 {
13 //续继要小眯去办理此事
14 }
15 else
16 {
17 //小眯跟我说,她们那边没人卖给我们.唉,这可怎么办,我们的项目紧呀,最少差三个人,现在人员不到项目也无法启动呀!没办法,我亲自出马,于是我拔通了TT公司董事的电话
18
19 object[] objList = TTCompany.CustomerAccess.CallTT("LG");
20 //真晕,说给了我三个人,竟然还包装起来.当时急,也没问这三个人的具体情况,这可怎么办,再打电话过去问,有点不好意思吧!
21 //怎么办?
22 //怎么办?
23 //我又无法访问到她们公司人员资料表,看来她们公司对人才管理得很保守
24 //我左想右想,为何不试试反射?对没错,我们就用反射
25
26 foreach(object obj in objList)
27 {
28 Type objType=obj.GetType();
29 PropertyInfo[] propertyList=objType.GetProperties();
30 //我们先看这些人有哪些属性(打印出来)
31 for(int i=0;i<propertyList.Length;i++)
32 {
33 Console.Write("{0}\t",propertyList[i].Name);
34 }
35 Console.WriteLine();
36 //我们再看看这些人属性的值,并打印出来
37 for(int j=0;j<propertyList.Length;j++)
38 {
39 Console.Write("{0}\t",propertyList[j].GetValue(obj,null));
40 }
41 Console.WriteLine();
42 Console.WriteLine();
43 }
44 }
45 Console.ReadKey();
46
47 //哈哈,三个人的基本资料全部出来了,不过好像有点少,TT公司也真是的,人员信息也搞得这么神密,不过看到是信息学院和农业大学的应该不会很烂,,呵呵,我们的项目可以正常启动了!
48
49 }
50 }
51}
打印结果:
Code
1
2namespace TTCompany
3{
4 /**////<summery>
5 ///公司内部用的人员资料表
6 ///</summery>
7 public class Person
8 {
9 --- 构造器 ---#region --- 构造器 ---
10 public Person()
11 {
12 }
13 public Person(string name,int age,string university)
14 {
15 this.name = name;
16 this.age = age;
17 this.university = university;
18 }
19
20 #endregion
21
22 --- 私有字段 ---#region --- 私有字段 ---
23
24 private string name = string.Empty;
25 private int age = 0;
26 private string university =string.Empty;
27
28 #endregion
29
30 --- 公有属性 ---#region --- 公有属性 ---
31
32 /**//// <summary>
33 /// 人的姓名
34 /// </summary>
35 public string Name
36 {
37 get{ return name; }
38 set{ name = value;}
39 }
40
41 /**//// <summary>
42 /// 人的年龄
43 /// </summary>
44 public int Age
45 {
46 get{ return age;}
47 set
48 {
49 if(value>130||value<=0)
50 {
51 throw new Exception("这个人的年龄有问题!");
52 }
53 else
54 {
55 age = value;
56 }
57 }
58 }
59
60 /**//// <summary>
61 /// 毕业学校
62 /// </summary>
63 public string University
64 {
65 get{ return university;}
66 set{ university = value;}
67 }
68
69 #endregion
70 }
71 public class CustomerAccess
72 {
73 /**//// <summary>
74 ///TT公司人力资源访问接口
75 /// </summary>
76 /// <returns>返回一个是否有人可卖</returns>
77 public static bool CallHumanResource(string customerName)
78 {
79 //小眯说话态度不好,人家一听是她就把电话挂了.
80 if(customerName=="xiaomi")
81 {
82 return false;
83 }
84 return true;
85 }
86
87 /**//// <summary>
88 ///TT公司老板访问接口
89 /// </summary>
90 /// <returns>返回一个对象集合</returns>
91 public static object[] CallTT(string customerName)
92 {
93 if(customerName=="LG")
94 {
95 //经过一般交谈,她公司同意卖三个人给我,呵呵!
96 object[] personCollection=new object[]
97 {
98 new Person("赖子",21,"江西信息学院"),
99 new Person("陈云",21,"江西信息学院"),
100 new Person("张江帆",21,"江西农业大学")
101 };
102 return personCollection;
103 }
104 else
105 {
106 return null;
107 }
108 }
109 }
110}
1
2namespace TTCompany
3{
4 /**////<summery>
5 ///公司内部用的人员资料表
6 ///</summery>
7 public class Person
8 {
9 --- 构造器 ---#region --- 构造器 ---
10 public Person()
11 {
12 }
13 public Person(string name,int age,string university)
14 {
15 this.name = name;
16 this.age = age;
17 this.university = university;
18 }
19
20 #endregion
21
22 --- 私有字段 ---#region --- 私有字段 ---
23
24 private string name = string.Empty;
25 private int age = 0;
26 private string university =string.Empty;
27
28 #endregion
29
30 --- 公有属性 ---#region --- 公有属性 ---
31
32 /**//// <summary>
33 /// 人的姓名
34 /// </summary>
35 public string Name
36 {
37 get{ return name; }
38 set{ name = value;}
39 }
40
41 /**//// <summary>
42 /// 人的年龄
43 /// </summary>
44 public int Age
45 {
46 get{ return age;}
47 set
48 {
49 if(value>130||value<=0)
50 {
51 throw new Exception("这个人的年龄有问题!");
52 }
53 else
54 {
55 age = value;
56 }
57 }
58 }
59
60 /**//// <summary>
61 /// 毕业学校
62 /// </summary>
63 public string University
64 {
65 get{ return university;}
66 set{ university = value;}
67 }
68
69 #endregion
70 }
71 public class CustomerAccess
72 {
73 /**//// <summary>
74 ///TT公司人力资源访问接口
75 /// </summary>
76 /// <returns>返回一个是否有人可卖</returns>
77 public static bool CallHumanResource(string customerName)
78 {
79 //小眯说话态度不好,人家一听是她就把电话挂了.
80 if(customerName=="xiaomi")
81 {
82 return false;
83 }
84 return true;
85 }
86
87 /**//// <summary>
88 ///TT公司老板访问接口
89 /// </summary>
90 /// <returns>返回一个对象集合</returns>
91 public static object[] CallTT(string customerName)
92 {
93 if(customerName=="LG")
94 {
95 //经过一般交谈,她公司同意卖三个人给我,呵呵!
96 object[] personCollection=new object[]
97 {
98 new Person("赖子",21,"江西信息学院"),
99 new Person("陈云",21,"江西信息学院"),
100 new Person("张江帆",21,"江西农业大学")
101 };
102 return personCollection;
103 }
104 else
105 {
106 return null;
107 }
108 }
109 }
110}
有表达不清的地方,望大家指出,谢谢!
作者:Louja
出处:http://louja.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此声明,且在文章页面给出原文连接,否则保留追究法律责任的权利。