Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Rozhraní .NET Framework 4.6.1 je dodáváno se sadou nástrojů řídicích aktivit toku, včetně ForEach<T>, které umožňuje iterování přes kolekce IEnumerable<T>.
ForEach<T> vyžaduje, aby jeho Values vlastnost byla typu IEnumerable<T>. To brání uživatelům v iterování datových struktur, které implementují IEnumerable<T> rozhraní (například ArrayList). Negenerická verze ForEach<T> překonává tento požadavek, ovšem za cenu větší běhové složitosti při zajišťování kompatibility typů hodnot v kolekci.
Ukázka NonGenericForEach ukazuje, jak implementovat negenerickou ForEach<T> aktivitu a jejího návrháře. Tuto aktivitu lze použít k iteraci přes ArrayList.
Aktivita ForEach
Příkaz C#/Visual Basic foreach vyčíslí prvky kolekce a spustí vložený příkaz pro každý prvek kolekce. Ekvivalentní činnosti foreach WF jsou ForEach<T> a ParallelForEach<T>. Aktivita ForEach<T> obsahuje seznam hodnot a tělo. Za běhu se seznam iteruje a tělo se spustí pro každou hodnotu v seznamu.
Ve většině případů by obecná verze aktivity měla být upřednostňovaným řešením, protože pokrývá většinu scénářů, ve kterých by byla použita, a poskytuje kontrolu typů v době kompilace. Ne generická verze se dá použít k iterování prostřednictvím typů, které implementují ne generické IEnumerable rozhraní.
Definice třídy
Následující příklad kódu ukazuje definici ne generické ForEach aktivity.
[ContentProperty("Body")]
public class ForEach : NativeActivity
{
[RequiredArgument]
[DefaultValue(null)]
InArgument<IEnumerable> Values { get; set; }
[DefaultValue(null)]
[DependsOn("Values")]
ActivityAction<object> Body { get; set; }
}
Text (volitelné) Typ ActivityActionObject, který se spouští pro každý prvek v kolekci. Každý jednotlivý prvek je předán do body prostřednictvím své Argument vlastnosti.
Hodnoty (volitelné) Kolekce prvků, které jsou iterovány. Zajištění, aby všechny prvky kolekce byly kompatibilní typy provedeny za běhu.
Příklad použití příkazu ForEach
Následující kód ukazuje použití aktivity ForEach v aplikaci.
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)))
}
}
};
| Podmínka | Zpráva | Závažnost | Typ výjimky |
|---|---|---|---|
Hodnoty jsou null |
Hodnota argumentu požadované aktivity Values nebyla zadána. | Chyba | InvalidOperationException |
Návrhář ForEach
Návrhář aktivity pro ukázku se podobá návrháři poskytovanému pro integrovanou ForEach<T> aktivitu. Návrhář se zobrazí v sadě nástrojů v kategorii Ukázky, Negenerické aktivity. V sadě nástrojů se návrhář jmenuje ForEachWithBodyFactory, protože aktivita zveřejňuje IActivityTemplateFactory, který vytvoří aktivitu s správně nakonfigurovanou 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"
}
}
};
}
}
Spuštění této ukázky
Nastavte projekt podle svého výběru jako počáteční projekt řešení:
CodeTestClient ukazuje, jak používat aktivitu pomocí kódu.
DesignerTestClient ukazuje, jak používat aktivitu v návrháři.
Sestavte a spusťte projekt.