private void LoadParameterOrNull(ParameterInfo pi, Type type) { EmitHelper emit = Context.MethodBuilder.Emitter; object[] attrs = pi.GetCustomAttributes(typeof(ParamNullValueAttribute), true); object nullValue = attrs.Length == 0? null: ((ParamNullValueAttribute)attrs[0]).Value; Label labelNull = emit.DefineLabel(); Label labelEndIf = emit.DefineLabel(); if (pi.Attributes == ParameterAttributes.Out) { emit .ldnull .end() ; return; } if (nullValue != null) { Type nullValueType = type; bool isNullable = TypeHelper.IsNullable(type); if (type.IsEnum) { nullValueType = Enum.GetUnderlyingType(type); nullValue = System.Convert.ChangeType(nullValue, nullValueType); } else if (isNullable) { nullValueType = type.GetGenericArguments()[0]; emit .ldarga (pi) .call (type, "get_HasValue") .brfalse (labelNull) ; } if (nullValueType == nullValue.GetType() && emit.LoadWellKnownValue(nullValue)) { if (nullValueType == typeof(string)) emit .ldargEx (pi, false) .call (nullValueType, "Equals", nullValueType) .brtrue (labelNull) ; else if (isNullable) emit .ldarga (pi) .call (type, "get_Value") .beq (labelNull) ; else emit .ldargEx (pi, false) .beq (labelNull) ; } else { string nullString = TypeDescriptor.GetConverter(nullValue).ConvertToInvariantString(nullValue); FieldBuilder staticField = CreateNullValueField(nullValueType, nullString); MethodInfo miEquals = new TypeHelper(nullValueType).GetPublicMethod("Equals", nullValueType); if (miEquals == null) { // Is it possible? // throw new TypeBuilderException(string.Format( Resources.DataAccessorBuilder_EqualsMethodIsNotPublic, type.FullName)); } if (isNullable) emit .ldsflda (staticField) .ldarga (pi) .call (pi.ParameterType, "get_Value") ; else emit .ldsflda (staticField) .ldarg (pi) ; if (miEquals.GetParameters()[0].ParameterType.IsClass) emit .boxIfValueType(nullValueType) ; emit .call (miEquals) .brtrue (labelNull) ; } } if (type.IsEnum) emit .ldloc (_locManager) .callvirt (typeof (DbManager).GetProperty("MappingSchema").GetGetMethod()) ; emit .ldargEx(pi, true) ; if (type.IsEnum) emit .ldc_i4_1 .callvirt (typeof (MappingSchema), "MapEnumToValue", typeof (object), typeof (bool)) ; if (nullValue != null) { emit .br (labelEndIf) .MarkLabel (labelNull) .ldnull .MarkLabel (labelEndIf) ; } }