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(T value);

15 public delegate T PropertyGetter();

16

17 public partial class Tools_TestGrid :

18 {

19 #region 泛型委托实现

20 public PropertyGetter PropGet;

21 public PropertySetter PropSet;

22 public void BuildSetMethod(TestData td)

23 {

24 Type t = e();

25 PropertyInfo pi = perty("Name");

26 MethodInfo setter = Method();

27

28 PropSet = (PropertySetter)Delegate(typeof(PropertySetter), td,

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)Delegate(typeof(PropertyGetter), td,

getter);

40

41 //string value = strPropGetter();

42 }

43

44 #endregion

45

46 #region 表达式树实现

47 Func LmdGetProp; //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 = >(body, param_obj).Compile();

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 = >(pGetter, param_u).Compile();

72 #endregion

73 }

74 Action LmdSetProp;

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 = >(body, param_obj,

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 }