Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
.NET Framework 4.6.1 enthält in seiner Toolbox eine Reihe von Kontrollflussaktivitäten, einschließlich ForEach<T>, die das Iterieren durch IEnumerable<T> Kollektionen ermöglichen.
ForEach<T> erfordert, dass die Values Eigenschaft vom Typ IEnumerable<T>ist. Dies hindert Benutzer daran, Datenstrukturen zu durchlaufen, die die Schnittstelle IEnumerable<T> implementieren (z. B. ArrayList). Die nicht generische Version von ForEach<T> überwindet diese Anforderung auf Kosten einer höheren Laufzeitkomplexität, um die Kompatibilität der Typen der Werte in der Sammlung sicherzustellen.
Im Beispiel "NonGenericForEach " wird gezeigt, wie eine nicht generische ForEach<T> Aktivität und ihr Designer implementiert werden. Diese Aktivität kann zum Durchlaufen von ArrayList verwendet werden.
ForEach-Aktivität
Die C#/Visual Basic-Anweisung foreach
listet die Elemente einer Auflistung auf und führt eine eingebettete Anweisung für jedes Element der Auflistung aus. Die entsprechenden WF-Aktivitäten für foreach
sind ForEach<T> und ParallelForEach<T>. Die ForEach<T> Aktivität enthält eine Liste von Werten und einen Inhalt. Zur Runtime wird die Liste durchlaufen, und der Text wird für jeden Wert in der Liste ausgeführt.
In den meisten Fällen sollte die generische Version der Aktivität die bevorzugte Lösung sein, da sie die meisten Szenarien abdeckt, in denen sie verwendet werden würde, und stellt die Typüberprüfung zur Kompilierungszeit bereit. Die nicht generische Version kann zum Durchlaufen von Typen verwendet werden, die die nicht generische IEnumerable Schnittstelle implementieren.
Klassendefinition
Das folgende Codebeispiel zeigt die Definition einer nicht generischen ForEach
Aktivität.
[ContentProperty("Body")]
public class ForEach : NativeActivity
{
[RequiredArgument]
[DefaultValue(null)]
InArgument<IEnumerable> Values { get; set; }
[DefaultValue(null)]
[DependsOn("Values")]
ActivityAction<object> Body { get; set; }
}
Text (optional): Das ActivityAction-Element mit dem Typ Object, das für jedes Element in der Sammlung ausgeführt wird. Jedes einzelne Element wird über seine Argument
Eigenschaft an den Körper übergeben.
Werte (optional) Die Sammlung von Elementen, über die iteriert wird. Die Sicherstellung, dass alle Elemente der Auflistung kompatible Typen aufweisen, erfolgt zur Laufzeit.
Beispiel für die Verwendung von ForEach
Der folgende Code veranschaulicht die Verwendung der ForEach-Aktivität in einer Anwendung.
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)))
}
}
};
Zustand | Nachricht | Schweregrad | Ausnahmetyp |
---|---|---|---|
Werte sind null |
Der Wert für ein erforderliches Aktivitätsargument "Values" wurde nicht angegeben. | Fehler | InvalidOperationException |
ForEach-Designer
Der Aktivitäts-Designer für das Beispiel ähnelt dem Designer, der für die integrierte ForEach<T>-Aktivität bereitgestellt wurde. Der Designer wird in der Toolbox in der Kategorie "Beispiele", " Nicht generische Aktivitäten " angezeigt. Der Designer wird in der Toolbox ForEachWithBodyFactory genannt, da die Aktivität ein IActivityTemplateFactory-Element in der Toolbox verfügbar macht, das die Aktivität mit einem ordnungsgemäß konfigurierten ActivityAction-Element erstellt.
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"
}
}
};
}
}
So führen Sie dieses Beispiel aus
Legen Sie das Projekt Ihrer Wahl als Startprojekt der Lösung fest:
CodeTestClient zeigt, wie die Aktivität mithilfe von Code verwendet wird.
DesignerTestClient zeigt, wie die Aktivität innerhalb des Designers verwendet wird.
Erstellen Sie das Projekt, und führen Sie es aus.