Example #1
0
        private static Converter <DataRow, T> Create()
        {
            var type     = typeof(T);
            var method   = new DynamicMethod("ConvertDataRowTo" + type.Name, type, new[] { EmitStatic.DataRowType }, type);
            var il       = method.GetILGenerator();
            var arrIndex = il.DeclareLocal(EmitStatic.Int32ArrayType);
            var entity   = il.DeclareLocal(type);
            var index    = il.DeclareLocal(EmitStatic.Int32Type);
            var label1   = il.DefineLabel();

            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Brtrue_S, label1);
            il.Emit(OpCodes.Ldnull);
            il.Emit(OpCodes.Ret);
            il.MarkLabel(label1);
            il.Emit(OpCodes.Ldtoken, type);
            il.Emit(OpCodes.Call, EmitStatic.GetTypeFromHandle);
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Callvirt, EmitStatic.GetTable);
            il.Emit(OpCodes.Call, EmitStatic.GetIndexArray);
            il.Emit(OpCodes.Stloc, arrIndex);
            il.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
            il.Emit(OpCodes.Stloc, entity);
            il.Emit_GenerateSetPropertiesIL(type, arrIndex, index, entity, () => { il.Emit(OpCodes.Ldarg_0); });
            il.Emit(OpCodes.Ldloc, entity);
            il.Emit(OpCodes.Ret);
            return(method.CreateConverter <DataRow, T>());
        }
Example #2
0
        private static Converter <DataTable, List <T> > Create()
        {
            var type       = typeof(T);
            var listType   = typeof(List <T>);
            var method     = new DynamicMethod("ConvertDataTableToList" + type.Name, listType, new[] { EmitStatic.DataTableType }, type);
            var il         = method.GetILGenerator();
            var arrIndex   = il.DeclareLocal(EmitStatic.Int32ArrayType);
            var list       = il.DeclareLocal(listType);
            var index      = il.DeclareLocal(EmitStatic.Int32Type);
            var dr         = il.DeclareLocal(EmitStatic.DataRowType);
            var entity     = il.DeclareLocal(type);
            var enumerator = il.DeclareLocal(EmitStatic.IEnumeratorType);
            var disposable = il.DeclareLocal(EmitStatic.IDisposableType);
            var label1     = il.DefineLabel();
            var label2     = il.DefineLabel();
            var label3     = il.DefineLabel();
            var label4     = il.DefineLabel();
            var label5     = il.DefineLabel();
            var label6     = il.DefineLabel();

            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Brtrue_S, label1);
            il.Emit(OpCodes.Ldnull);
            il.Emit(OpCodes.Ret);
            il.MarkLabel(label1);
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Callvirt, EmitStatic.GetRows);
            il.Emit(OpCodes.Callvirt, EmitStatic.GetRowsCount);
            il.Emit(OpCodes.Brtrue_S, label2);
            il.Emit(OpCodes.Newobj, listType.GetConstructor(Type.EmptyTypes));
            il.Emit(OpCodes.Ret);
            il.MarkLabel(label2);
            il.Emit(OpCodes.Ldtoken, type);
            il.Emit(OpCodes.Call, EmitStatic.GetTypeFromHandle);
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Call, EmitStatic.GetIndexArray);
            il.Emit(OpCodes.Stloc, arrIndex);
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Callvirt, EmitStatic.GetRows);
            il.Emit(OpCodes.Callvirt, EmitStatic.GetRowsCount);
            il.Emit(OpCodes.Newobj, listType.GetConstructor(new[] { EmitStatic.Int32Type }));
            il.Emit(OpCodes.Stloc, list);
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Callvirt, EmitStatic.GetRows);
            il.Emit(OpCodes.Callvirt, EmitStatic.GetRowsEnumerator);
            il.Emit(OpCodes.Stloc, enumerator);
            il.BeginExceptionBlock();
            il.Emit(OpCodes.Br, label4);
            il.MarkLabel(label3);
            il.Emit(OpCodes.Ldloc, enumerator);
            il.Emit(OpCodes.Callvirt, EmitStatic.GetCurrent);
            il.Emit(OpCodes.Castclass, EmitStatic.DataRowType);
            il.Emit(OpCodes.Stloc, dr);
            il.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
            il.Emit(OpCodes.Stloc, entity);
            il.Emit_GenerateSetPropertiesIL(type, arrIndex, index, entity, () => { il.Emit(OpCodes.Ldloc, dr); });
            il.Emit(OpCodes.Ldloc, list);
            il.Emit(OpCodes.Ldloc, entity);
            il.Emit(OpCodes.Callvirt, listType.GetMethod("Add"));
            il.MarkLabel(label4);
            il.Emit(OpCodes.Ldloc, enumerator);
            il.Emit(OpCodes.Callvirt, EmitStatic.MoveNext);
            il.Emit(OpCodes.Brtrue, label3);
            il.Emit(OpCodes.Leave_S, label6);
            il.BeginFinallyBlock();
            il.Emit(OpCodes.Ldloc, enumerator);
            il.Emit(OpCodes.Isinst, EmitStatic.IEnumeratorType);
            il.Emit(OpCodes.Stloc, disposable);
            il.Emit(OpCodes.Ldloc, disposable);
            il.Emit(OpCodes.Brfalse_S, label5);
            il.Emit(OpCodes.Ldloc, disposable);
            il.Emit(OpCodes.Callvirt, EmitStatic.Dispose);
            il.MarkLabel(label5);
            il.EndExceptionBlock();
            il.MarkLabel(label6);
            il.Emit(OpCodes.Ldloc, list);
            il.Emit(OpCodes.Ret);
            return(method.CreateConverter <DataTable, List <T> >());
        }