Sdílet prostřednictvím


Ne generický ForEach

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

  1. Nastavte projekt podle svého výběru jako počáteční projekt řešení:

    1. CodeTestClient ukazuje, jak používat aktivitu pomocí kódu.

    2. DesignerTestClient ukazuje, jak používat aktivitu v návrháři.

  2. Sestavte a spusťte projekt.