示例#1
0
        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>)));
        }
示例#2
0
 public void Add(BindItem value)
 {
     _items.Add(value);
 }