private void CreateDefaultInstance( FieldBuilder field, TypeHelper fieldType, TypeHelper objectType, EmitHelper emit) { if (!CheckObjectHolderCtor(fieldType, objectType)) return; if (objectType.Type == typeof(string)) { emit .ldarg_0 .LoadInitValue (objectType) ; } else if (objectType.IsArray) { FieldBuilder initializer = GetArrayInitializer(objectType); emit .ldarg_0 .ldsfld (initializer) ; } else { ConstructorInfo ci = objectType.GetPublicDefaultConstructor(); if (ci == null) { if (objectType.Type.IsValueType) return; string message = string.Format( Resources.TypeBuilder_PropertyTypeHasNoPublicDefaultCtor, Context.CurrentProperty.Name, Context.Type.FullName, objectType.FullName); emit .ldstr (message) .newobj (typeof(TypeBuilderException), typeof(string)) .@throw .end() ; return; } else { emit .ldarg_0 .newobj (ci) ; } } if (IsObjectHolder) { emit .newobj (fieldType, objectType) ; } emit .stfld (field) ; }
private void BuildHolderInstance(EmitHelper emit) { string fieldName = GetFieldName(); FieldBuilder field = Context.GetField(fieldName); TypeHelper fieldType = new TypeHelper(field.FieldType); TypeHelper objectType = new TypeHelper(GetObjectType()); ConstructorInfo ci = fieldType.GetPublicDefaultConstructor(); if (ci != null) { emit .ldarg_0 .newobj (ci) .stfld (field) ; } else { if (!CheckObjectHolderCtor(fieldType, objectType)) return; emit .ldarg_0 .ldnull .newobj (fieldType, objectType) .stfld (field) ; } }