Udostępnij przez


ForEach bez użycia szablonu

Program .NET Framework 4.6.1 dostarczany jest z zestawem aktywności przepływu sterowania, w tym ForEach<T>, który umożliwia iterowanie przez IEnumerable<T> kolekcji.

ForEach<T> wymaga, aby jego właściwość Values była typu IEnumerable<T>. Uniemożliwia to użytkownikom iterowanie struktur danych implementujących IEnumerable<T> interfejs (na przykład ArrayList). Wersja niegeneryczna ForEach<T> pokonuje to wymaganie, kosztem większej złożoności czasowej wykonywania, aby zapewnić zgodność typów wartości w kolekcji.

W przykładzie NonGenericForEach pokazano, jak zaimplementować działanie niegeneryczne ForEach<T> i jego projektanta. To działanie może służyć do iterowania przez ArrayList.

Działanie ForEach

Instrukcja języka C#/Visual Basic foreach wylicza elementy kolekcji, wykonując osadzoną instrukcję dla każdego elementu kolekcji. Równoważne działania WF to: foreach, ForEach<T> i ParallelForEach<T>. Działanie ForEach<T> zawiera listę wartości i treść. W czasie wykonywania lista jest iterowana, a treść jest wykonywana dla każdej wartości na liście.

W większości przypadków ogólna wersja działania powinna być preferowanym rozwiązaniem, ponieważ obejmuje większość scenariuszy, w których byłaby używana, i zapewnia sprawdzanie typów w czasie kompilacji. Wersja niegeneryczna może służyć do iterowania za pośrednictwem typów, które implementują interfejs niegeneryczny IEnumerable .

Definicja klasy

Poniższy przykład kodu przedstawia definicję nieogólnej aktywności ForEach.

[ContentProperty("Body")]
public class ForEach : NativeActivity
{
    [RequiredArgument]
    [DefaultValue(null)]
    InArgument<IEnumerable> Values { get; set; }

    [DefaultValue(null)]
    [DependsOn("Values")]
    ActivityAction<object> Body { get; set; }
}

Treść (opcjonalnie) Typ ActivityActionObject, który jest wykonywany dla każdego elementu w kolekcji. Każdy pojedynczy element jest przekazywany do Ciała poprzez swoją właściwość Argument.

Wartości (opcjonalnie) Kolekcja elementów, które są iterowane. Zapewnienie, że wszystkie elementy kolekcji są zgodne typy, są wykonywane w czasie wykonywania.

Przykład użycia narzędzia ForEach

Poniższy kod pokazuje, jak używać działania ForEach w aplikacji.

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)))
           }
       }
   };
Warunek Komunikat Ciężkość Typ wyjątku
Wartości to null Wartość wymaganego argumentu działania "Values" nie została podana. Błąd InvalidOperationException

Projektant "ForEach"

Projektant działań dla przykładu jest podobny do projektanta udostępnionego dla wbudowanego ForEach<T> działania. Projektant pojawi się w przyborniku w kategorii Przykłady, Działania Inne Niż Ogólne. Projektant ma nazwę ForEachWithBodyFactory w przyborniku, ponieważ aktywność uwidacznia element IActivityTemplateFactory w przyborniku, co powoduje utworzenie aktywności z prawidłowo skonfigurowanym elementem 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"
                }
            }
        };
    }
}

Aby uruchomić ten przykład

  1. Ustaw wybrany projekt jako projekt startowy rozwiązania:

    1. CodeTestClient pokazuje, jak używać działania przy użyciu kodu.

    2. DesignerTestClient pokazuje, jak używać działania w projektancie.

  2. Skompiluj i uruchom projekt.