Niet-algemene foreach
.NET Framework 4.6.1 wordt geleverd in de werkset van een set controlestroomactiviteiten, waaronder ForEach<T>, waarmee verzamelingen kunnen worden herhaald 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> deze vereiste overkomt deze vereiste, ten koste van meer runtimecomplexiteit om ervoor te zorgen dat de typen 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 door te gaan ArrayList.
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 runtime wordt de lijst curseerd en wordt de hoofdtekst 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-algemene versie kan worden gebruikt voor het doorlopen van typen die de niet-algemene 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) Het ActivityAction type Object, dat wordt uitgevoerd voor elk element in de verzameling. Elk afzonderlijk element wordt doorgegeven aan de hoofdtekst via Argument
de eigenschap.
Waarden (optioneel) De verzameling elementen die worden ge curseerd. Ervoor zorgen dat alle elementen van de verzameling van compatibele typen worden uitgevoerd tijdens runtime.
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 | Ernst | Type uitzondering |
---|---|---|---|
Waarden is null |
Waarde voor een vereist activiteitsargument 'Waarden' is niet opgegeven. | Error | InvalidOperationException |
ForEach Designer
De activiteitsontwerper voor het voorbeeld is vergelijkbaar met de ontwerpfunctie die is opgegeven voor de ingebouwde ForEach<T> activiteit. De ontwerpfunctie wordt weergegeven in de werkset in de categorie Samples, Non-Generic Activities . De ontwerper heet ForEachWithBodyFactory in de werkset, omdat de activiteit een IActivityTemplateFactory in de werkset beschikbaar maakt, waardoor de activiteit wordt gemaakt met een correct geconfigureerde ActivityActionactiviteit.
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.
Maak het project en voer het uit.