看了老趙快速反射順便提到了一個DynamicUtilites反射工具,我就舉個小例子說明下怎么使用它
由于傳統的反射性能不是很好,所以許多高手都想盡方法提高反射的性能
以下DynamicUtilites編是其中一個(和.net4.0中的那個Dynamic反射不同)
首先在項目中添加DynamicUtilites項目
DynamicUtilites項目下有三個文件
Dynamic.cs
DynamicComparer.cs
DynamicEmit.cs
如果由于精力有限無法了解該反射輔助類的具體實現原理,請大家原諒 ^^,大致是將原有反射代碼的封裝和優化,有空我會去了解下該輔助類的源碼
以下簡單介紹如何使用該反射類
先建立一個ICallable接口,注意是泛型接口s
代碼
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DynamicTest
6 {
7 publicinterface ICallable<T>
8 {
9 double Age { set;get; }
10 string Gender { set;get; }
11 string Name { set;get;}
12 T Create(string name, string gender);
13 string Eat(T t);
14 //string Dead(T t);
15 string Sleep(T t,string time);
16 }
17 }
18
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DynamicTest
6 {
7 publicinterface ICallable<T>
8 {
9 double Age { set;get; }
10 string Gender { set;get; }
11 string Name { set;get;}
12 T Create(string name, string gender);
13 string Eat(T t);
14 //string Dead(T t);
15 string Sleep(T t,string time);
16 }
17 }
18
然后編寫一個老虎類實現該接口
代碼
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DynamicTest
6 {
7 publicclass Tiger:ICallable<Tiger>
8 {
9 public Tiger() { }
10 public Tiger(double age, string name, string gender)
11 {
12 this.age = age;
13 this.gender = gender;
14 this.name = name;
15
16 }
17
18 private Rabbit rabbit;
19 public Rabbit Rabbit
20 {
21 get { return rabbit; }
22 set { value = rabbit; }
23 }
24
25 privatedouble age=0;
26 publicdouble Age
27 {
28 get { return age; }
29 set { value = age; }
30 }
31 privatestring gender;
32 publicstring Gender
33 {
34 get { return gender; }
35 set { value = gender; }
36 }
37
38 privatestring name;
39 publicstring Name
40 {
41 get { return name; }
42 set { value = name; }
43 }
44
45 public Tiger Create(string name, string gender)
46 {
47 thrownew Exception("The method or operation is not implemented.");
48 }
49
50
51
52
53 publicstring Sleep(Tiger t, string time)
54 {
55 return"the time is "+time+" ,the tiger witch name is "+ t.Name +" is sleeping!";
56 }
57
58 publicstring Eat(Tiger t)
59 {
60 return t.Name+" is eating";
61 }
62
63
64 }
65
66
67
68
69 publicclass Rabbit
70 {
71 privatestring name;
72 publicstring Name
73 {
74 get { return name; }
75 set { value = name; }
76 }
77
78
79 public Rabbit(string name)
80 {
81 this.name = name;
82 }
83 }
84 }
85
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DynamicTest
6 {
7 publicclass Tiger:ICallable<Tiger>
8 {
9 public Tiger() { }
10 public Tiger(double age, string name, string gender)
11 {
12 this.age = age;
13 this.gender = gender;
14 this.name = name;
15
16 }
17
18 private Rabbit rabbit;
19 public Rabbit Rabbit
20 {
21 get { return rabbit; }
22 set { value = rabbit; }
23 }
24
25 privatedouble age=0;
26 publicdouble Age
27 {
28 get { return age; }
29 set { value = age; }
30 }
31 privatestring gender;
32 publicstring Gender
33 {
34 get { return gender; }
35 set { value = gender; }
36 }
37
38 privatestring name;
39 publicstring Name
40 {
41 get { return name; }
42 set { value = name; }
43 }
44
45 public Tiger Create(string name, string gender)
46 {
47 thrownew Exception("The method or operation is not implemented.");
48 }
49
50
51
52
53 publicstring Sleep(Tiger t, string time)
54 {
55 return"the time is "+time+" ,the tiger witch name is "+ t.Name +" is sleeping!";
56 }
57
58 publicstring Eat(Tiger t)
59 {
60 return t.Name+" is eating";
61 }
62
63
64 }
65
66
67
68
69 publicclass Rabbit
70 {
71 privatestring name;
72 publicstring Name
73 {
74 get { return name; }
75 set { value = name; }
76 }
77
78
79 public Rabbit(string name)
80 {
81 this.name = name;
82 }
83 }
84 }
85
真正的客戶端反射類的實現,請大家仔細看注釋,
代碼
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 //using System.Reflection;
5 using Phydeaux.Utilities;
6 using System.Reflection;
7
8 namespace DynamicTest
9 {
10 /*
11 * 該類是實現客戶端反射,思路是先反射出老虎類對象
12 * 然后檢查該對象屬性是否符合條件,并且通過反射改變
13 * 實體屬性值,加以顯示
14 *
15 *
16 */
17 class Program
18 {
19 staticvoid Main(string[] args)
20 {
21 ActionMethod<Tiger>(Check, 99, "逆時針の風", "male");
22 }
23
24 ///<summary>
25 /// 一個委托
26 ///</summary>
27 ///<typeparam name="T"></typeparam>
28 ///<param name="t"></param>
29 publicdelegatevoid CheckAnimal<T>(T t);
30
31
32 ///<summary>
33 /// 檢查對象屬性
34 ///</summary>
35 ///<param name="tiger"></param>
36 publicstaticvoid Check(Tiger tiger)
37 {
38 if (string.IsNullOrEmpty(tiger.Name))
39 {
40 tiger.Name ="逆時針の風";
41 }
42 if (string.IsNullOrEmpty(tiger.Gender))
43 {
44 tiger.Gender ="male";
45 }
46 if (tiger.Age ==0)
47 {
48 tiger.Age =99;
49 }
50 }
51
52 ///<summary>
53 /// 利用構造器對象反射出T對象t實例
54 ///</summary>
55 ///<typeparam name="T">對象</typeparam>
56 ///<param name="con">構造器對象</param>
57 ///<param name="age"></param>
58 ///<param name="name"></param>
59 ///<param name="gender"></param>
60 ///<returns></returns>
61 publicstatic T CreateObject<T>(Constructor<T, double, string, string> con, double age, string name, string gender) where T : ICallable<T>
62 {
63 T t = (T)con.Invoke(age, name, gender);
64 return t;
65 }
66
67 ///<summary>
68 /// 利用Dnamic發射獲取相關對象和行為
69 ///</summary>
70 ///<typeparam name="T">對象</typeparam>
71 ///<param name="checkAnimal">checkAnimal委托,在Main(string[] args)方法中直接用方法Check填入,注意用方法名即可</param>
72 ///<param name="age"></param>
73 ///<param name="name"></param>
74 ///<param name="gender"></param>
75 publicstaticvoid ActionMethod<T>(CheckAnimal<T> checkAnimal, double age, string name, string gender) where T : ICallable<T>, new()
76 {
77 /*先建立構造器對象,因為tiger類的構造函數參數是(double age, string name, string gender)
78 * 所以Explicit<double, string, string>也必須一致,構造器對象的目的是使用Invoke方法反射獲取該對象
79 */
80 Constructor<T, double, string, string> create = Dynamic<T>.Constructor.Explicit<double, string, string>.CreateDelegate(ParameterList.Auto);
81 /*
82 * 這里比較抽象,產生animal_EatAction委托找出tiger類的eat方法
83 * 需要注意的是Explicit<T>的T參數決定于eat方法的參數個數和類型
84 *
85 */
86 Func<T, string, T> animal_EatAction = Dynamic<T>.Instance.Function<string>.Explicit<T>.CreateDelegate("Eat");
87
88 /*
89 * 同樣利用Dynamic中的自定義委托Proc接受屬性的寫反射
90 *
91 */
92 Proc<T, double> SetAge = Dynamic<T>.Instance.Field<double>.Setter.CreateDelegate("age");
93 /*
94 * 同樣利用Dynamic中的委托Func接受屬性的讀反射
95 *
96 */
97 Func<T, double> GetAge = Dynamic<T>.Instance.Field<double>.Getter.CreateDelegate("age");
98
99 //先獲取t對象實例
100 T t = CreateObject<T>(create, age, name, gender);
101 //獲取該類年齡屬性值
102 double originAge = GetAge(t);
103 //更改該類年齡屬性值
104 SetAge(t,100);
105
106 //執行各種屬性檢查
107 checkAnimal(t);
108 //執行t對象的eat方法
109 Console.WriteLine(animal_EatAction(t, t)+" the age of this tiger is "+t.Age+"!");
110 Console.ReadLine();
111 }
112
113 }
114 }
115
2 using System.Collections.Generic;
3 using System.Text;
4 //using System.Reflection;
5 using Phydeaux.Utilities;
6 using System.Reflection;
7
8 namespace DynamicTest
9 {
10 /*
11 * 該類是實現客戶端反射,思路是先反射出老虎類對象
12 * 然后檢查該對象屬性是否符合條件,并且通過反射改變
13 * 實體屬性值,加以顯示
14 *
15 *
16 */
17 class Program
18 {
19 staticvoid Main(string[] args)
20 {
21 ActionMethod<Tiger>(Check, 99, "逆時針の風", "male");
22 }
23
24 ///<summary>
25 /// 一個委托
26 ///</summary>
27 ///<typeparam name="T"></typeparam>
28 ///<param name="t"></param>
29 publicdelegatevoid CheckAnimal<T>(T t);
30
31
32 ///<summary>
33 /// 檢查對象屬性
34 ///</summary>
35 ///<param name="tiger"></param>
36 publicstaticvoid Check(Tiger tiger)
37 {
38 if (string.IsNullOrEmpty(tiger.Name))
39 {
40 tiger.Name ="逆時針の風";
41 }
42 if (string.IsNullOrEmpty(tiger.Gender))
43 {
44 tiger.Gender ="male";
45 }
46 if (tiger.Age ==0)
47 {
48 tiger.Age =99;
49 }
50 }
51
52 ///<summary>
53 /// 利用構造器對象反射出T對象t實例
54 ///</summary>
55 ///<typeparam name="T">對象</typeparam>
56 ///<param name="con">構造器對象</param>
57 ///<param name="age"></param>
58 ///<param name="name"></param>
59 ///<param name="gender"></param>
60 ///<returns></returns>
61 publicstatic T CreateObject<T>(Constructor<T, double, string, string> con, double age, string name, string gender) where T : ICallable<T>
62 {
63 T t = (T)con.Invoke(age, name, gender);
64 return t;
65 }
66
67 ///<summary>
68 /// 利用Dnamic發射獲取相關對象和行為
69 ///</summary>
70 ///<typeparam name="T">對象</typeparam>
71 ///<param name="checkAnimal">checkAnimal委托,在Main(string[] args)方法中直接用方法Check填入,注意用方法名即可</param>
72 ///<param name="age"></param>
73 ///<param name="name"></param>
74 ///<param name="gender"></param>
75 publicstaticvoid ActionMethod<T>(CheckAnimal<T> checkAnimal, double age, string name, string gender) where T : ICallable<T>, new()
76 {
77 /*先建立構造器對象,因為tiger類的構造函數參數是(double age, string name, string gender)
78 * 所以Explicit<double, string, string>也必須一致,構造器對象的目的是使用Invoke方法反射獲取該對象
79 */
80 Constructor<T, double, string, string> create = Dynamic<T>.Constructor.Explicit<double, string, string>.CreateDelegate(ParameterList.Auto);
81 /*
82 * 這里比較抽象,產生animal_EatAction委托找出tiger類的eat方法
83 * 需要注意的是Explicit<T>的T參數決定于eat方法的參數個數和類型
84 *
85 */
86 Func<T, string, T> animal_EatAction = Dynamic<T>.Instance.Function<string>.Explicit<T>.CreateDelegate("Eat");
87
88 /*
89 * 同樣利用Dynamic中的自定義委托Proc接受屬性的寫反射
90 *
91 */
92 Proc<T, double> SetAge = Dynamic<T>.Instance.Field<double>.Setter.CreateDelegate("age");
93 /*
94 * 同樣利用Dynamic中的委托Func接受屬性的讀反射
95 *
96 */
97 Func<T, double> GetAge = Dynamic<T>.Instance.Field<double>.Getter.CreateDelegate("age");
98
99 //先獲取t對象實例
100 T t = CreateObject<T>(create, age, name, gender);
101 //獲取該類年齡屬性值
102 double originAge = GetAge(t);
103 //更改該類年齡屬性值
104 SetAge(t,100);
105
106 //執行各種屬性檢查
107 checkAnimal(t);
108 //執行t對象的eat方法
109 Console.WriteLine(animal_EatAction(t, t)+" the age of this tiger is "+t.Age+"!");
110 Console.ReadLine();
111 }
112
113 }
114 }
115
以上反射的性能肯定比.net自帶的 強一點,該輔助類下載地址暫時找不到,請大家諒解,地址放在公司電腦里了。。過幾天發布地址
謝謝!

浙公網安備 33010602011771號