C# Emit问题->DataReader 转Entity....
正常读取reader.GetInt32的方法如下:
现在加了一个判断,就是当值为IsDBNull的时候,则取DefaultValue,代码如下:
异常信息如下:
未经处理的异常: System.InvalidProgramException: JIT 编译器遇到内部限制。
在 (IDataReader )...
由于对IL不是很熟,希望大家帮忙看下,谢谢。。
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不是很熟,希望大家帮忙看下,谢谢。。
...全文
相关推荐
dynamiccodegeneration:2012 年完成的关于使用 Relfecion.Emit 在 .NET 中动态代码生成的演示
**代码生成工具**:例如,ORM(对象关系映射)框架如Entity Framework就利用动态代码生成,将数据库模式转化为C#类。让我们深入了解一下Reflection.Emit:1.
c# 23种设计模式
在编程领域,设计模式是一种被广泛认可的解决常见问题的最佳实践。C#作为.NET框架的主要编程语言,同样可以应用这23种经典的设计模式。
.NET元编程英文版
开发者可以根据实际需求选择合适的元编程技术来解决特定问题。
C#基础思维导图(整理版)
C#基础思维导图(整理版)系统性地呈现了C#编程语言的核心知识体系,覆盖从入门到进阶的完整学习路径。
Castle Dynamic Proxy代理使用
高性能: Castle Dynamic Proxy使用Emit和委托等技术生成代理类型,调用真实类的方法,性能方面也没有太多损失。3.


