From 8ebc5caa25ecb7e5fee9d2abc4175abbdc01a8a7 Mon Sep 17 00:00:00 2001 From: Jon Hynes Date: Mon, 12 Jun 2023 08:53:46 -0400 Subject: [PATCH] Backward-compatibility with KeyValuePair metadata items (#8870) Backport #8870 to vs17.7. --- .../BackEnd/TaskExecutionHost/TaskExecutionHost.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs b/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs index 705ca12979e..b2eee81b3f7 100644 --- a/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs +++ b/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs @@ -1395,9 +1395,15 @@ private void GatherTaskItemOutputs(bool outputTargetIsItem, string outputTargetN // Setting an item spec expects the escaped value, as does setting metadata. newItem = new ProjectItemInstance(_projectInstance, outputTargetName, EscapingUtilities.Escape(output.ItemSpec), parameterLocationEscaped); - newItem.SetMetadataOnTaskOutput(output.CloneCustomMetadata() - .Cast() - .Select(x => new KeyValuePair((string)x.Key, EscapingUtilities.Escape((string)x.Value)))); + newItem.SetMetadataOnTaskOutput(EnumerateMetadata(output.CloneCustomMetadata())); + + static IEnumerable> EnumerateMetadata(IDictionary customMetadata) + { + foreach (DictionaryEntry de in customMetadata) + { + yield return new KeyValuePair((string)de.Key, EscapingUtilities.Escape((string)de.Value)); + } + } } }