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>()); }
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> >()); }