예제 #1
0
            private void InvokeSet(PropertyInfo propertyInfo)
            {
                var propertyType = propertyInfo.PropertyType;

                il.Emit(OpCodes.Ldloc, item);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldloc, field);

                if (DataReaderMethodMap.TryGetValue(propertyInfo.PropertyType, out MethodInfo getMethod))
                {
                    il.Emit(OpCodes.Callvirt, getMethod);
                }
                else
                {
                    il.Emit(OpCodes.Callvirt, getItemMethod);
                    il.Emit(OpCodes.Castclass, propertyInfo.PropertyType);
                }
                if (propertyType.IsGenericType &&
                    propertyType.GetGenericTypeDefinition().Equals(typeof(Nullable <>))
                    )
                {
                    var propetyType = propertyInfo.PropertyType;
                    var constructor = propetyType.GetConstructor(new Type[] { propetyType.GetGenericArguments()[0] });
                    il.Emit(OpCodes.Newobj, constructor);
                }

                il.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod(true));
            }
            private void SimpleProperty(ParameterInfo parameter, PropertyInfo propertyInfo, int currentIndex)
            {
                Label endLabel     = il.DefineLabel();
                Label defaultLabel = il.DefineLabel();

                //var field = fields[index];
                il.Emit(OpCodes.Ldarg_1);
                il.Emit(OpCodes.Ldc_I4, currentIndex);
                il.Emit(OpCodes.Ldelem_I4);
                il.Emit(OpCodes.Stloc, field);
                //if(field >= 0)
                il.Emit(OpCodes.Ldloc, field);
                il.Emit(OpCodes.Ldc_I4_0);
                il.Emit(OpCodes.Blt_S, defaultLabel);

                var propertyType = propertyInfo.PropertyType;

                //if(!reader.IsDBNull(field))
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldloc, field);
                il.Emit(OpCodes.Callvirt, SupportMembers.DataReader.IsDBNull);
                il.Emit(OpCodes.Ldc_I4_0);
                il.Emit(OpCodes.Ceq);
                il.Emit(OpCodes.Brfalse_S, defaultLabel);

                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldloc, field);

                if (DataReaderMethodMap.TryGetValue(propertyInfo.PropertyType, out MethodInfo getMethod))
                {
                    il.Emit(OpCodes.Callvirt, getMethod);
                }
                else
                {
                    il.Emit(OpCodes.Callvirt, getItemMethod);
                    il.Emit(OpCodes.Castclass, propertyInfo.PropertyType);
                }
                if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition().Equals(typeof(Nullable <>)))
                {
                    var propetyType = propertyInfo.PropertyType;
                    var constructor = propetyType.GetConstructor(new Type[] { propetyType.GetGenericArguments()[0] });
                    il.Emit(OpCodes.Newobj, constructor);
                }

                il.Emit(OpCodes.Br_S, endLabel);

                il.MarkLabel(defaultLabel);
                Default(parameter.ParameterType);
                il.MarkLabel(endLabel);
            }