/// <summary> /// Creates a new field in the target assembly, for the specified type. /// </summary> /// <param name="targetDeclaringType">The target declaring type.</param> /// <param name="yourField">Your field.</param> /// <param name="attr">The action attribute.</param> /// <exception cref="PatchDeclerationException">Thrown if this member collides with another member, and the error cannot be resolved.</exception> /// <returns></returns> private NewMemberStatus CreateNewField(TypeDefinition targetDeclaringType, FieldDefinition yourField, NewMemberAttribute attr) { if (attr.IsImplicit) { Log_implicitly_creating_member("field", yourField); } else { Log_creating_member("field", yourField); } var maybeDuplicate = targetDeclaringType.GetField(yourField.Name); if (maybeDuplicate != null) { Log_duplicate_member("field", yourField, maybeDuplicate); if ((DebugOptions & DebugFlags.CreationOverwrites) != 0) { Log_overwriting(); return NewMemberStatus.Continue; } if (attr.IsImplicit) { return NewMemberStatus.InvalidItem; } throw Errors.Duplicate_member("type", yourField.FullName, maybeDuplicate.FullName); } var targetField = new FieldDefinition(yourField.Name, yourField.Resolve().Attributes, FixTypeReference(yourField.FieldType)) { InitialValue = yourField.InitialValue, //probably for string consts Constant = yourField.Constant }; targetDeclaringType.Fields.Add(targetField); return NewMemberStatus.Continue; }
private FieldDefinition CopyField(FieldDefinition yourField, string newName) { var targetField = new FieldDefinition(newName, yourField.Resolve().Attributes, FixTypeReference(yourField.FieldType)) { InitialValue = yourField.InitialValue, //for field RVA Constant = yourField , MarshalInfo = CopyMarshalInfo(yourField.MarshalInfo), HasConstant = yourField.HasConstant }; return targetField; }