C# Emit问题->DataReader 转Entity....

wangping_li wangping_li 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
正常读取reader.GetInt32的方法如下:

il.Emit(OpCodes.Ldloc_S, item);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldloc_S, colIndices[i]);
il.Emit(OpCodes.Callvirt, DataRecord_GetInt32);
il.Emit(OpCodes.Callvirt, columnInfoes[i].SetMethod);


现在加了一个判断,就是当值为IsDBNull的时候,则取DefaultValue,代码如下:

var local = il.DeclareLocal(columnInfoes[i].Type);//int i
Label intNull = il.DefineLabel();//is null lable
Label intCommon = il.DefineLabel();//not null lable

il.Emit(OpCodes.Ldloca, local);
il.Emit(OpCodes.Ldarg_0);//将索引 0 处的局部变量i加载到计算堆栈上->i
il.Emit(OpCodes.Ldloc_S, colIndices[i]);//index ->为IsDBNull(index)的参数
il.Emit(OpCodes.Callvirt, DataRecord_IsDBNull);
il.Emit(OpCodes.Brtrue_S, intNull);//如果is null则转向intNull标签

il.Emit(OpCodes.Ldarg_0);//i
il.Emit(OpCodes.Ldloc_S, colIndices[i]);
il.Emit(OpCodes.Callvirt, DataRecord_GetInt32);
il.Emit(OpCodes.Br_S, intCommon);//is not null则转向intCommon标签

//is null
il.MarkLabel(intNull);
il.Emit(OpCodes.Ldc_I4, columnInfoes[i].DefaultValue);//为null时这里赋值

//not null
il.MarkLabel(intCommon);
il.Emit(OpCodes.Ldloc_S, item);
il.Emit(OpCodes.Ldloc, local);
il.Emit(OpCodes.Callvirt, columnInfoes[i].SetMethod);


异常信息如下:

未经处理的异常: System.InvalidProgramException: JIT 编译器遇到内部限制。
在 (IDataReader )...

由于对IL不是很熟,希望大家帮忙看下,谢谢。。

...全文
评论 24
收藏 已收藏
分享
返回顶部
wangping_li
.NET社区 62,272 成员 668,968 内容