Как получить все ключи метаданных для любого элемента ItemGroup?
Есть ли способ получить все ключи метаданных, связанные с данным элементом?
Я хочу сделать что-то вроде следующего.
Дано:
<ItemGroup>
<MyItems Include="item1">
<key1>val1</key1>
<key2>val2</key2>
<key3>val3</key3>
</MyItems>
<MyItems Include="item2">
<key4>val4</key4>
</MyItems>
</ItemGroup>
Уметь определять, что у item1 есть метаданные, доступные для key1, key2 и key3, и что у item2 есть метаданные, доступные для key4, не зная, каковы имена этих ключей на самом деле.
По сути, я пытаюсь использовать метаданные для указания атрибутов, о которых я понятия не имею, а затем пытаюсь найти способ проверить, какие атрибуты были указаны.
Другими словами, я считаю, что метаданные каждого элемента - это просто хэш, содержащий пары ключ / значение, и я пытаюсь выяснить, что это за ключи.
Кто-нибудь знает, как это сделать с помощью msbuild?
Спасибо
1 ответ
Я решил эту проблему с помощью встроенной задачи, подобной следующей:
<UsingTask
TaskName="GetMetadataTask"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup>
<MyItemGroup ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
<MetadataString Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System"/>
<Code Type="Fragment" Language="cs">
<![CDATA[
StringBuilder command = new StringBuilder();
foreach (ITaskItem item in MyItemGroup )
{
command.AppendFormat("ItemName={0}\r\n", item);
foreach (string parameter in item.MetadataNames)
{
command.AppendFormat(" {0}={1}\r\n", parameter, item.GetMetadata(parameter));
}
command.AppendFormat("\r\n");
}
MetadataString = command.ToString();
]]>
</Code>
</Task>
</UsingTask>
Обратите внимание, что приведенное выше также включает все метаданные по умолчанию, которые MSBuild автоматически добавляет к каждому элементу в группе элементов (например, FullPath, RootDir, Filename и т. Д.). В моей реализации я добавил дополнительную проверку, чтобы игнорировать те элементы метаданных, которые мне не нужны
Пример использования:
<GetMetadataTask MyItemGroup="@(YourItemGroup)">
<Output TaskParameter="MetadataString" PropertyName="YourMetadataString"/>
</GetMetadataTask>
<Message Text="$(YourMetadataString)" />
Чтобы увидеть вывод сообщения в окне вывода Visual Studio, вам может потребоваться изменить выходную детализацию MSBuild по крайней мере на Normal.