Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
.NET Framework 4.6.1 wordt geleverd met een set besturingsstroomactiviteiten, waaronder ForEach<T>, waarmee kan worden herhaald door verzamelingen IEnumerable<T>.
ForEach<T> vereist dat de Values eigenschap van het type IEnumerable<T>is. Dit voorkomt dat gebruikers itereren over gegevensstructuren die interface implementeren IEnumerable<T> (bijvoorbeeld ArrayList). De niet-algemene versie van ForEach<T> overbrugt deze vereiste, maar leidt tot meer runtime complexiteit om te garanderen dat de typen van de waarden in de verzameling compatibel zijn.
In het voorbeeld NonGenericForEach ziet u hoe u een niet-algemene ForEach<T> activiteit en de ontwerpfunctie implementeert. Deze activiteit kan worden gebruikt om ArrayList te doorlopen.
ForEach-activiteit
Met de instructie C#/Visual Basic foreach worden de elementen van een verzameling opgesomd, waarbij een ingesloten instructie wordt uitgevoerd voor elk element van de verzameling. De gelijkwaardige WF-activiteiten foreach zijn ForEach<T> en ParallelForEach<T>. De ForEach<T> activiteit bevat een lijst met waarden en een hoofdtekst. Tijdens uitvoering wordt de lijst doorlopen en wordt de body uitgevoerd voor elke waarde in de lijst.
In de meeste gevallen moet de algemene versie van de activiteit de voorkeursoplossing zijn, omdat deze de meeste scenario's omvat waarin deze zou worden gebruikt en typecontrole op het moment van compileren biedt. De niet-generieke versie kan worden gebruikt om te itereren door typen die de niet-generieke IEnumerable interface implementeren.
Klassedefinitie
In het volgende codevoorbeeld ziet u de definitie van een niet-algemene ForEach activiteit.
[ContentProperty("Body")]
public class ForEach : NativeActivity
{
[RequiredArgument]
[DefaultValue(null)]
InArgument<IEnumerable> Values { get; set; }
[DefaultValue(null)]
[DependsOn("Values")]
ActivityAction<object> Body { get; set; }
}
Hoofdtekst (optioneel) De ActivityAction van het type Object, die wordt uitgevoerd voor elk element in de verzameling. Elk afzonderlijk element wordt doorgegeven aan de body via de eigenschap Argument.
Waarden (optioneel) De verzameling elementen die worden geïtereerd. Ervoor zorgen dat alle elementen van de verzameling compatibel zijn, wordt tijdens runtime uitgevoerd.
Voorbeeld van het gebruik van ForEach
De volgende code laat zien hoe u de ForEach-activiteit in een toepassing gebruikt.
string[] names = { "bill", "steve", "ray" };
DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };
Activity sampleUsage =
new ForEach
{
Values = new InArgument<IEnumerable>(c=> names),
Body = new ActivityAction<object>
{
Argument = iterationVariable,
Handler = new WriteLine
{
Text = new InArgument<string>(env => string.Format("Hello {0}", iterationVariable.Get(env)))
}
}
};
| Conditie | Bericht | Ernstigheid | Uitzonderingstype |
|---|---|---|---|
Waarden zijn null |
Waarde voor een vereist activiteitsargument 'Waarden' is niet opgegeven. | Fout | InvalidOperationException |
VoorElk Ontwerper
De activiteitsontwerper voor het voorbeeld is vergelijkbaar met de ontwerper die is verstrekt bij de ingebouwde ForEach<T> activiteit. De ontwerper verschijnt in de werkset in de categorie Samples, Non-Generic Activities. De ontwerper heet ForEachWithBodyFactory in de werkbalk, omdat de activiteit een IActivityTemplateFactory in de werkbalk beschikbaar maakt, waardoor de activiteit wordt aangemaakt met een correct geconfigureerde ActivityAction.
public sealed class ForEachWithBodyFactory : IActivityTemplateFactory
{
public Activity Create(DependencyObject target)
{
return new Microsoft.Samples.Activities.Statements.ForEach()
{
Body = new ActivityAction<object>()
{
Argument = new DelegateInArgument<object>()
{
Name = "item"
}
}
};
}
}
Dit voorbeeld uitvoeren
Stel het project van uw keuze in als het opstartproject van de oplossing:
CodeTestClient laat zien hoe u de activiteit gebruikt met behulp van code.
DesignerTestClient laat zien hoe u de activiteit in de ontwerpfunctie gebruikt.
Bouw het project en voer het uit.