Arbeta med objektfunktioner
Kod i aktiviteter och mål kan anropa objektfunktioner för att få information om objekten i projektet (i MSBuild 4.0 och senare). Dessa funktioner förenklar hanteringen av distinkta objekt och går snabbare än att loopa igenom objekten.
Funktioner för strängobjekt
Du kan använda strängmetoder och egenskaper i .NET Framework för att arbeta med valfritt objektvärde. För String metoder anger du metodnamnet. För String egenskaper anger du egenskapsnamnet efter "get_".
För objekt som har flera strängar körs strängmetoden eller egenskapen på varje sträng.
I följande exempel visas hur du använder dessa strängobjektfunktioner.
<ItemGroup>
<theItem Include="andromeda;tadpole;cartwheel" />
</ItemGroup>
<Target Name = "go">
<Message Text="IndexOf @(theItem->IndexOf('r'))" />
<Message Text="Replace @(theItem->Replace('tadpole', 'pinwheel'))" />
<Message Text="Length @(theItem->get_Length())" />
<Message Text="Chars @(theItem->get_Chars(2))" />
</Target>
<!--
Output:
IndexOf 3;-1;2
Replace andromeda;pinwheel;cartwheel
Length 9;7;9
Chars d;d;r
-->
Funktioner för inbyggda objekt
Tabellen nedan visar de inbyggda funktioner som är tillgängliga för objekt.
Funktion | Exempel | Beskrivning |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Returnerar en ny uppsättning objekt med en angiven relativ sökväg som läggs till i alla indataobjekt. |
Count |
@(MyItems->Count()) |
Returnerar antalet objekt. |
DirectoryName |
@(MyItems->DirectoryName()) |
Returnerar motsvarigheten till Path.DirectoryName för varje objekt. |
Distinct |
@(MyItems->Distinct()) |
Returnerar objekt som har distinkta Include värden. Metadata ignoreras. Jämförelsen är skiftlägesokänslig. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
Returnerar objekt som har distinkta itemspec värden. Metadata ignoreras. Jämförelsen är skiftlägeskänslig. |
Exists |
@(MyItems->Exists()) |
Filtrerar en uppsättning objekt till de som faktiskt finns på disken. |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
Med en uppsättning objekt returnerar de objekt som representerar alla fäderkataloger. Ingen beställning garanteras. |
Reverse |
@(MyItems->Reverse()) |
Returnerar objekten i omvänd ordning. |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
Returnerar en boolean för att ange om ett objekt har det angivna metadatanamnet och värdet. Jämförelsen är skiftlägesokänslig. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Returnerar objekt med deras metadata avmarkerade. Endast itemspec behålls. |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
Returnerar objekt som har det angivna metadatanamnet. Jämförelsen är skiftlägesokänslig. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
Returnerar värdena för metadata som har metadatanamnet. Objekten som returneras har samma metadata som källvärdena. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
Returnerar objekt som har det angivna metadatanamnet och värdet. Jämförelsen är skiftlägesokänslig. |
Notera
Exists
kan också användas i andra sammanhang. i MSBuild-villkor, till exempel Condition="Exists('path')"
; eller i Statiska egenskapsfunktioner, till exempel $([System.IO.File]::Exists("path"))
.
I följande exempel visas hur du använder funktioner för inbyggda objekt.
<ItemGroup>
<TheItem Include="first">
<Plant>geranium</Plant>
</TheItem>
<TheItem Include="second">
<Plant>algae</Plant>
</TheItem>
<TheItem Include="third">
<Plant>geranium</Plant>
</TheItem>
</ItemGroup>
<Target Name="go">
<Message Text="MetaData: @(TheItem->Metadata('Plant'))" />
<Message Text="HasMetadata: @(theItem->HasMetadata('Plant'))" />
<Message Text="WithMetadataValue: @(TheItem->WithMetadataValue('Plant', 'geranium'))" />
<Message Text=" " />
<Message Text="Count: @(theItem->Count())" />
<Message Text="Reverse: @(theItem->Reverse())" />
</Target>
<!--
Output:
MetaData: geranium;algae;geranium
HasMetadata: first;second;third
WithMetadataValue: first;third
Count: 3
Reverse: third;second;first
-->
Anropa en strängmetod
Om en objektfunktion inte är tillgänglig som matchar ditt scenario kan du uppnå en liknande effekt genom att skapa ett strängobjekt från metadata med hjälp av egenskapsfunktionen new
och anropa alla String
metoden på den. Följande kod använder till exempel en understrängssökning för att filtrera en objektlista i ett mål.
<Project>
<PropertyGroup>
<SearchString>abc</SearchString>
</PropertyGroup>
<ItemGroup>
<UnfilteredList Include="abcdef;abc;def;xyz"></UnfilteredList>
</ItemGroup>
<Target Name="FilterItemList">
<ItemGroup>
<FilteredList Include="@(UnfilteredList)" Condition="$([System.String]::new('%(UnfilteredList.Identity)').Contains($(SearchString)))"></FilteredList>
</ItemGroup>
<Message Text="Result: @(FilteredList)"/>
</Target>
</Project>
Identifiera dubbletter när du använder funktionen Metadata-objekt
Funktionen Metadata
objekt bevarar källobjektens ursprungliga metadata. Detta har vissa konsekvenser när du överväger om de returnerade objekten är dubbletter eller inte. Om du vill styra hur dubbletter hanteras kan du använda attributet KeepDuplicates. Du kan också ta bort metadata, om de inte behövs, genom att lägga till RemoveMetadata, i vilket fall endast själva värdena beaktas vid identifiering av dubbletter.
<Target Name="MetadataToItem">
<ItemGroup>
<Sample Include="AAA" SomeItems="1;2;3" />
<Sample Include="BBB" SomeItems="3;4;5" />
</ItemGroup>
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" />
</ItemGroup>
<Message Text="AllSomeItems is @(AllSomeItems)" />
</Target>
Utdata är följande:
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
Följande ändring av koden resulterar i att det duplicerade objektvärdet identifieras och tas bort:
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
MSBuild-villkorsfunktioner
Funktionen HasTrailingSlash
är inte en objektfunktion. Den är tillgänglig för användning med attributet Condition
. Se MSBuild-villkor.
Relaterat innehåll
Du kan också använda attribut för att utföra åtgärder i objektlistor, till exempel filtrering av objektmetadata. Mer information finns i Objekt.