private static FillObjectDelegate <T> MakeFillObjectDelegate <T>(EntityBinder binder) { System.Type[] parameterTypes = new System.Type[] { typeof(T), typeof(IDataRecord) }; DynamicMethod method = new DynamicMethod("", typeof(T), parameterTypes, typeof(T), true); ILGenerator iLGenerator = method.GetILGenerator(); using (List <BindItem> .Enumerator enumerator = binder.bindItems().GetEnumerator()) { while (true) { if (!enumerator.MoveNext()) { break; } BindItem current = enumerator.Current; Label label = iLGenerator.DefineLabel(); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Ldc_I4, current.DbIndex); iLGenerator.Emit(OpCodes.Callvirt, typeof(IDataRecord).GetMethod("IsDBNull")); iLGenerator.Emit(OpCodes.Brtrue, label); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Ldc_I4, current.DbIndex); parameterTypes = new System.Type[] { typeof(int) }; iLGenerator.Emit(OpCodes.Callvirt, typeof(IDataRecord).GetMethod("get_Item", parameterTypes)); if (current.DbType == BindItem.Type.TypeByteArray) { iLGenerator.Emit(OpCodes.Unbox_Any, typeof(byte[])); } else if (current.DbType == BindItem.Type.TypeInteger) { iLGenerator.Emit(OpCodes.Unbox_Any, typeof(int)); } else if (current.DbType == BindItem.Type.TypeDouble) { iLGenerator.Emit(OpCodes.Unbox_Any, typeof(double)); } else if (current.DbType == BindItem.Type.TypeDecimal) { iLGenerator.Emit(OpCodes.Unbox_Any, typeof(decimal)); } else if (current.DbType == BindItem.Type.TypeBoolean) { iLGenerator.Emit(OpCodes.Unbox_Any, typeof(bool)); } else if (current.DbType == BindItem.Type.TypeDate) { iLGenerator.Emit(OpCodes.Unbox, typeof(System.DateTime)); iLGenerator.Emit(OpCodes.Ldstr, "dd/MM/yyyy HH:mm:ss.fff"); parameterTypes = new System.Type[] { typeof(string) }; iLGenerator.Emit(OpCodes.Callvirt, typeof(System.DateTime).GetMethod("ToString", parameterTypes)); //iLGenerator.Emit(OpCodes.Callvirt, typeof(object).GetMethod("ToString", System.Type.EmptyTypes)); } iLGenerator.Emit(OpCodes.Stfld, typeof(T).GetField(current.DomainFieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase)); iLGenerator.MarkLabel(label); } } iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ret); return((FillObjectDelegate <T>)method.CreateDelegate(typeof(FillObjectDelegate <T>))); }
public void Add(BindItem value) { _items.Add(value); }