Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
Ustaw wybrany projekt jako projekt startowy rozwiązania:
CodeTestClient pokazuje, jak używać działania przy użyciu kodu.
DesignerTestClient pokazuje, jak używać działania w projektancie.
Skompiluj i uruchom projekt.