/// <summary> /// Sets a new metadata value on the ItemDefinition. /// </summary> /// <remarks>Unevaluated value is assumed to be escaped as necessary</remarks> public ProjectMetadata SetMetadataValue(string name, string unevaluatedValue) { if (Link != null) { return(Link.SetMetadataValue(name, unevaluatedValue)); } XmlUtilities.VerifyThrowArgumentValidElementName(name); ErrorUtilities.VerifyThrowArgument(!FileUtilities.ItemSpecModifiers.IsItemSpecModifier(name), "ItemSpecModifierCannotBeCustomMetadata", name); ErrorUtilities.VerifyThrowInvalidOperation(!XMakeElements.ReservedItemNames.Contains(name), "CannotModifyReservedItemMetadata", name); ProjectMetadata metadatum; if (_metadata != null) { metadatum = _metadata[name]; if (metadatum != null) { Project.VerifyThrowInvalidOperationNotImported(metadatum.Xml.ContainingProject); metadatum.UnevaluatedValue = unevaluatedValue; return(metadatum); } } // We can't use the item definition that this object came from as a root, as it doesn't map directly // to a single XML element. Instead, add a new one to the project. Best we can do. ProjectItemDefinitionElement itemDefinition = _project.Xml.AddItemDefinition(_itemType); ProjectMetadataElement metadatumXml = itemDefinition.AddMetadata(name, unevaluatedValue); _metadata = _metadata ?? new PropertyDictionary <ProjectMetadata>(); string evaluatedValueEscaped = _project.ExpandMetadataValueBestEffortLeaveEscaped(this, unevaluatedValue, metadatumXml.Location); metadatum = new ProjectMetadata(this, metadatumXml, evaluatedValueEscaped, null /* predecessor unknown */); _metadata.Set(metadatum); return(metadatum); }