0

次に、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にファイルされたデータがNULLである拡張機能が必要です。カスタム属性を使用して、デフォルト値を示すことができます。そこで、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);
4

1 に答える 1

0

Dapperを使用するだけです。それがSOにとって良いのであれば、それはあなたにとっても良いでしょう;-)

于 2011-06-28T13:04:41.700 に答える