private void AddPropertyFieldInitialization(FieldDefinition backingField, TypeSpec propertyType, List<Action<ILProcessor>> ctorIlActions) { if (propertyType.Maybe().OfType<TransformedType>().Select(x => x.MappedAsValueObject).OrDefault()) { var typeInfo = this.clientTypeInfoDict[propertyType]; ctorIlActions.Add(il => { il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Newobj, typeInfo.EmptyPocoCtor); il.Emit(OpCodes.Stfld, backingField); }); } else if (propertyType.IsCollection) { var genericInstanceFieldType = (GenericInstanceType)backingField.FieldType; var listReference = Import(typeof(List<>)); var listCtor = listReference.Resolve().GetConstructors().First(x => x.Parameters.Count == 0); var listCtorInstance = Import(listCtor).MakeHostInstanceGeneric(genericInstanceFieldType.GenericArguments[0]); ctorIlActions.Add(il => { il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Newobj, listCtorInstance); il.Emit(OpCodes.Stfld, backingField); }); } else if (propertyType.IsDictionary) { var genericInstanceFieldType = (GenericInstanceType)backingField.FieldType; var dictReference = Import(typeof(Dictionary<,>)); var dictCtor = dictReference.Resolve().GetConstructors().First(x => x.Parameters.Count == 0); var dictCtorInstance = Import(dictCtor).MakeHostInstanceGeneric(genericInstanceFieldType.GenericArguments.ToArray()); ctorIlActions.Add(il => { il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Newobj, dictCtorInstance); il.Emit(OpCodes.Stfld, backingField); }); } }