Nicht generisches ForEach-Element
Dieses Thema gilt für Windows Workflow Foundation 4.
Zur Toolbox von .NET Framework, Version 4 gehört ein Satz von Ablaufsteuerungsaktivitäten, einschließlich ForEach, die das Durchlaufen von IEnumerable-Auflistungen ermöglicht.
Für ForEach muss die Values-Eigenschaft den Typ IEnumerable aufweisen. Dies schließt Benutzer davon aus, Datenstrukturen zu durchlaufen, die die IEnumerable-Schnittstelle implementieren (z. B. ArrayList). Die nicht generische Version von ForEach bewältigt diese Anforderung zulasten einer größeren Laufzeitkomplexität zum Sicherstellen der Kompatibilität der Typen der Werte in der Auflistung.
In diesem Beispiel wird gezeigt, wie eine nicht generische ForEach-Aktivität und der Designer implementiert werden. Diese Aktivität kann zum Durchlaufen von ArrayList verwendet werden.
ForEach-Aktivität
Die C#/VB-Anweisung foreach zählt 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 und ParallelForEach. Die ForEach-Aktivität enthält eine Liste von Werten und einen Text. Zur Laufzeit 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 die meisten Szenarien, in denen sie verwendet wird, damit abgedeckt werden und sie zur Kompilierzeit eine Typüberprüfung bietet. Die nicht generische Version kann zum Durchlaufen von Typen, die die nicht generische IEnumerable-Schnittstelle implementieren, verwendet werden.
Klassendefinition
Im folgenden Codebeispiel wird die Definition einer nicht generischen ForEach-Aktivität veranschaulicht.
[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 Auflistung ausgeführt wird. Jedes einzelne Element wird durch die Argument-Eigenschaft in den Text übergeben.
- Werte (optional)
Die Auflistung von Elementen, die durchlaufen werden. Die Sicherstellung, dass alle Elemente der Auflistung kompatible Typen aufweisen, erfolgt zur Laufzeit.
Beispiel der Verwendung von ForEach
Im folgenden Code wird veranschaulicht, wie die ForEach-Aktivität in einer Anwendung verwendet wird.
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)))
}
}
};
Bedingung | Meldung | Schweregrad | Ausnahmetyp |
---|---|---|---|
Werte sind NULL |
Für das erforderliche Aktivitätsargument "Values1" wurde kein Wert angegeben. |
Fehler |
ForEach-Designer
Der Aktivitätsdesigner für das Beispiel ist dem Designer im Aussehen ähnlich, der für die integrierte ForEach-Aktivität dient. Der Designer wird in der Toolbox unter Beispiele, Kategorie 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 das Beispiel aus
Legen Sie das Projekt Ihrer Wahl als Startprojekt der Projektmappe fest:
CodeTestClient zeigt, wie die Aktivität mit Code verwendet wird.
DesignerTestClient zeigt, wie die Aktivität im Designer verwendet wird.
Erstellen Sie das Projekt, und führen Sie es aus.
Hinweis: |
---|
Die Beispiele sind möglicherweise bereits auf dem Computer installiert. Überprüfen Sie das folgende (standardmäßige) Verzeichnis, bevor Sie fortfahren.
<Installationslaufwerk>:\WF_WCF_Samples
Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)- und WF-Beispiele herunterzuladen. Dieses Beispiel befindet sich im folgenden Verzeichnis.
<Installationslaufwerk>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericForEach
|