欢迎光临
我的个人博客网站

使用Emit实现给实体赋值

代码:

使用Emit实现给实体赋值使用Emit实现给实体赋值

public static Action<T, object> EmitSetter<T>(string propertyName) {     var type = typeof(T);     var dynamicMethod = new DynamicMethod("EmitCall", null, new[] { type, typeof(object) }, type.Module);     var iLGenerator = dynamicMethod.GetILGenerator();      var callMethod = type.GetMethod("set_" + propertyName, BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public);     var parameterInfo = callMethod.GetParameters()[0];     var local = iLGenerator.DeclareLocal(parameterInfo.ParameterType, true);      iLGenerator.Emit(OpCodes.Ldarg_1);     if (parameterInfo.ParameterType.IsValueType)     {         iLGenerator.Emit(OpCodes.Unbox_Any, parameterInfo.ParameterType); // 如果是值类型,拆箱     }     else     {         iLGenerator.Emit(OpCodes.Castclass, parameterInfo.ParameterType); // 如果是引用类型,转换     }      iLGenerator.Emit(OpCodes.Stloc, local);     iLGenerator.Emit(OpCodes.Ldarg_0);     iLGenerator.Emit(OpCodes.Ldloc, local);      iLGenerator.EmitCall(OpCodes.Callvirt, callMethod, null);     iLGenerator.Emit(OpCodes.Ret);      return dynamicMethod.CreateDelegate(typeof(Action<T, object>)) as Action<T, object>; }

View Code

摘自博客:https://www.cnblogs.com/czly/archive/2018/06/01/9120280.html

 

赞(0) 打赏
未经允许不得转载:张拓的天空 » 使用Emit实现给实体赋值
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

专业的IT技术经验分享 更专业 更方便

联系我们本站主机

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏