如何将DataReader结果转换为实体? - >使用Emit

时间:2011-06-28 13:01:59

标签: c# il

现在我想将DataReader转换为实体。我有这样的方法:

 private static void ReadInt32(ILGenerator il, LocalBuilder item,
                List<DbColumnInfo> columnInfoes, LocalBuilder[] colIndices, int i)
            {
               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);

}

并按此处调用方法,

 if (IsCompatibleType(columnInfoes[i].Type, typeof(int)))
                    {
                        // item.%Property% = arg.GetInt32(%index%);
                        ReadInt32(il, item, columnInfoes, colIndices, i);
                    }

不幸的是,如果DB中的数据为NULL,则会出现异常。因为int类型不能是NULL值但是我把它转移到int?。然后证明我的调用方法效果很好。

但是在这里我想要一个扩展,当DB中的Data Filed为NULL时,我们可以使用Custom属性来指示默认值。所以我重新定义了ReadInt32如下,但令我惊讶的是,总是会出现JIT内部异常。我对IL不熟悉,我真的很期待一些帮助,非常感谢。

更改代码如下,但仍然存在错误,异常类型为: System.EntryPointNotFoundException:

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


            il.Emit(OpCodes.Ldloca, local);
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldloc_S, colIndices[i]);
            il.Emit(OpCodes.Callvirt, DataRecord_IsDBNull);// int i=isdbnull?
            il.Emit(OpCodes.Brtrue_S, intNull);// int i=isdbnull?intNull

            il.Emit(OpCodes.Ldloc_0);
            il.Emit(OpCodes.Ldloc_S, colIndices[i]);//int i=isdbnull?1000:getInt(32)

            il.Emit(OpCodes.Callvirt, DataRecord_GetInt32);//int i=isdbnull?1000:getInt32(i);
            il.Emit(OpCodes.Br_S, intCommon);

            il.MarkLabel(intNull);;
            il.Emit(OpCodes.Ldc_I4, 123);//intNull=DefaultValue  columnInfoes[i].DefaultValue
            il.MarkLabel(intCommon);
            il.Emit(OpCodes.Stloc_S, item);
            //il.Emit(OpCodes.Ldloc_S, item);
            il.Emit(OpCodes.Ldloc, local);
            il.Emit(OpCodes.Callvirt, columnInfoes[i].SetMethod);

1 个答案:

答案 0 :(得分:0)

只需使用Dapper即可。如果它对SO有好处,那对你也有好处; - )