2024年1月25日发(作者:)
C#各种反射动态赋值取值方法
简单代码示例:
1 using System;
2 using c;
3 using ;
4 using ;
5 using ;
6 using trols;
7 using ;
8 using KaiCommon;
9 using tion;
10 using ;
11 using sions;
12 using ;
13
14 public delegate void PropertySetter
15 public delegate T PropertyGetter
16
17 public partial class Tools_TestGrid :
18 {
19 #region 泛型委托实现
20 public PropertyGetter
21 public PropertySetter
22 public void BuildSetMethod(TestData td)
23 {
24 Type t = e();
25 PropertyInfo pi = perty("Name");
26 MethodInfo setter = Method();
27
28 PropSet = (PropertySetter
setter);
29
30 //string value = strPropGetter();
31 }
32
33 public void BuildGetMethod(TestData td)
34 {
35 Type t = e();
36 PropertyInfo pi = perty("Name");
37 MethodInfo getter = Method();
38
39 PropGet = (PropertyGetter
getter);
40
41 //string value = strPropGetter();
42 }
43
44 #endregion
45
46 #region 表达式树实现
47 Func
48 public void LmdGet(Type entityType, string propName)
49 {
50 #region 通过方法取值
51 var p = perty(propName);
52 //对象实例
53 var param_obj = ter(typeof(object), "obj");
54 //值
55 //var param_val = ter(typeof(object), "val");
56 //转换参数为真实类型
57 var body_obj = t(param_obj, entityType);
58
59 //调用获取属性的方法
60 var body = (body_obj, Method());
61 LmdGetProp =
62 #endregion
63
64 #region 表达式取值
65 //var p = perty(propName);
66 ////lambda的参数u
67 //var param_u = ter(entityType, "u");
68 ////lambda的方法体
69 //var pGetter = ty(param_u, p);
70 ////编译lambda
71 //LmdGetProp =
72 #endregion
73 }
74 Action
75 public void LmdSet(Type entityType, string propName)
76 {
77 var p = perty(propName);
78 //对象实例
79 var param_obj = ter(typeof(object), "obj");
80 //值
81 var param_val = ter(typeof(object), "val");
82 //转换参数为真实类型
83 var body_obj = t(param_obj, entityType);
84 var body_val = t(param_val, tyType);
85 //调用给属性赋值的方法
86 var body = (body_obj, Method(), body_val);
87 LmdSetProp =
param_val).Compile();
88
89 }
90 #endregion
91
92
93 #region Emit动态方法实现
94 public delegate void SetValueDelegateHandler(TestData entity, object value);
95 public SetValueDelegateHandler EmitSetValue;
96 public void BuildEmitMethod(Type entityType, string propertyName)
97 {
98 //Type entityType = e();
99 Type parmType = typeof(object);
100 // 指定函数名
101 string methodName = "set_" + propertyName;
102 // 搜索函数,不区分大小写 IgnoreCase
103 var callMethod = hod(methodName, ce |
Case | | lic);
104 // 获取参数
105 var para = ameters()[0];
106 // 创建动态函数
107 DynamicMethod method = new DynamicMethod("EmitCallable", null, new Type[]
{ entityType, parmType }, );
108 // 获取动态函数的 IL 生成器
109 var il = enerator();
110 // 创建一个本地变量,主要用于 Object Type to Propety Type
111 var local = eLocal(terType, true);
112 // 加载第 2 个参数【(T owner, object value)】的 value
113 (_1);
114 if (eType)
115 {
116 (_Any, terType);// 如果是值类型,拆箱 string =
(string)object;
117 }
118 else
119 {
120 (ass, terType);// 如果是引用类型,转换 Class = object as
Class
121 }
122 (, local);// 将上面的拆箱或转换,赋值到本地变量,现在这个本地变量是一个与目标函数相同数据类型的字段了。
123 (_0); // 加载第一个参数 owner
124 (, local);// 加载本地参数
125 ll(rt, callMethod, null);//调用函数
126 (); // 返回
127 /* 生成的动态函数类似:
128 * void EmitCallable(T owner, object value)
129 * {
130 * T local = (T)value;
131 * (local);
132 * }
133 */
134
135 EmitSetValue = Delegate(typeof(SetValueDelegateHandler)) as
SetValueDelegateHandler;
136
137 }
138 #endregion
139
140 protected void Page_Load(object sender, EventArgs e)
141 {
142
143 ("当前framework版本:" + + "
");
144 int max = 1000000;
145 ("循环次数:" + max + "
");
146 if (!IsPostBack)
147 {
148 //基本方法
149 DateTime time = ;
150 TestData d = new TestData();
151 for (int i = 0; i < max; i++)
152 {
153 = i;
154 }
155 TimeSpan ts = - time;
156 ("基本方法:" + illiseconds + "
");
157
158 //反射方法
159 Type type = e();
160 PropertyInfo pi = perty("Name");
161 time = ;
162 for (int i = 0; i < max; i++)
163 {
164 ue(d, i, null);
165 }
166 ts = - time;
167 ("反射方法:" + illiseconds + "
");
168
169 //dynamic动态类型方法
170 dynamic dobj = Instance
171 time = ;
172 for (int i = 0; i < max; i++)
173 {
174 = i;
175 }
176 ts = - time;
177 ("dynamic动态类型方法:" + illiseconds + "
");
178
179 //泛型委托赋值方法
180 = -1;
181 BuildSetMethod(d);
182 time = ;
183 for (int i = 0; i < max; i++)
184 {
185 t(i);
186 }
187 ts = - time;
188 ("泛型委托赋值方法:" + illiseconds + "
");
189 ("v:" + + "
");
190
191 //泛型委托取值方法
192 = -1;
193 BuildGetMethod(d);
194 time = ;
195 for (int i = 0; i < max; i++)
196 {
197 t();
198 }
199 ts = - time;
200 ("泛型委托取值方法:" + illiseconds + "
");
201 ("v:" + + "
");
202
203 //表达式树赋值方法
204 = -1;
205 LmdSet(typeof(TestData), "Name");
206 time = ;
207 for (int i = 0; i < max; i++)
208 {
209 Prop(d, i);
210 }
211 ts = - time;
212 ("表达式树赋值方法:" + illiseconds + "
");
213 ("v:" + + "
");
214
215 //表达式树取值方法
216 = -132;
217 (typeof(TestData), "Name");
218 time = ;
219 for (int i = 0; i < max; i++)
220 {
221 Prop(d);
222 }
223 ts = - time;
224 ("表达式树取值方法:" + illiseconds + "
");
225 ("v:" + Prop(d) + "
");
226
227 //EMIT动态方法赋值
228 = -1;
229 mitMethod(e(), "Name");
230 time = ;
231 for (int i = 0; i < max; i++)
232 {
233 tValue(d, i);
234 }
235 ts = - time;
236 ("EMIT动态方法:" + illiseconds + "
");
237 ("v:" + + "
");
238
239 //TestDataBind();
240 }
241 }
242
243 }
244
245 public class TestData
246 {
247 public int Name { get; set; }
248 }
发布评论