/// <summary> /// Creates a new ITaskItem with the contents of the old one. /// </summary> private ITaskItem CreateNewTaskItemFrom(ITaskItem copyFrom) { ITaskItem2 copyFromAsITaskItem2 = copyFrom as ITaskItem2; string escapedItemSpec = null; string escapedDefiningProject = null; Dictionary <string, string> escapedMetadata = null; if (copyFromAsITaskItem2 != null) { escapedItemSpec = copyFromAsITaskItem2.EvaluatedIncludeEscaped; escapedDefiningProject = copyFromAsITaskItem2.GetMetadataValueEscaped(FileUtilities.ItemSpecModifiers.DefiningProjectFullPath); IDictionary nonGenericEscapedMetadata = copyFromAsITaskItem2.CloneCustomMetadataEscaped(); if (nonGenericEscapedMetadata is Dictionary <string, string> ) { escapedMetadata = (Dictionary <string, string>)nonGenericEscapedMetadata; } else { escapedMetadata = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); foreach (object key in nonGenericEscapedMetadata.Keys) { escapedMetadata[(string)key] = (string)nonGenericEscapedMetadata[key] ?? String.Empty; } } } else { // If we don't have ITaskItem2 to fall back on, we have to make do with the fact that // CloneCustomMetadata, GetMetadata, & ItemSpec returns unescaped values, and // TaskParameterTaskItem's constructor expects escaped values, so escaping them all // is the closest approximation to correct we can get. escapedItemSpec = EscapingUtilities.Escape(copyFrom.ItemSpec); escapedDefiningProject = EscapingUtilities.EscapeWithCaching(copyFrom.GetMetadata(FileUtilities.ItemSpecModifiers.DefiningProjectFullPath)); IDictionary customMetadata = copyFrom.CloneCustomMetadata(); escapedMetadata = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); if (customMetadata != null && customMetadata.Count > 0) { foreach (string key in customMetadata.Keys) { escapedMetadata.Add(key, EscapingUtilities.Escape((string)customMetadata[key] ?? String.Empty)); } } } TaskParameterTaskItem taskItem = new TaskParameterTaskItem(escapedItemSpec, escapedDefiningProject, escapedMetadata); return(taskItem); }
/// <summary> /// Read an ITaskItem into the given parameter, using the given read translator /// </summary> private void ReadITaskItem(ITranslator translator, ref ITaskItem wrappedItem) { ErrorUtilities.VerifyThrow(translator.Mode == TranslationDirection.ReadFromStream, "Cannot call this method when writing!"); if (!TranslateNullable(translator, wrappedItem)) { return; } string escapedItemSpec = null; string escapedDefiningProject = null; Dictionary <string, string> escapedMetadata = null; translator.Translate(ref escapedItemSpec); translator.Translate(ref escapedDefiningProject); translator.TranslateDictionary(ref escapedMetadata, StringComparer.OrdinalIgnoreCase); wrappedItem = new TaskParameterTaskItem(escapedItemSpec, escapedDefiningProject, escapedMetadata); }