Nicht generisches ForEach-Element
Zur Toolbox von .NET Framework 4.6.1 gehören Ablaufsteuerungsaktivitäten, einschließlich ForEach<T>, die das Durchlaufen von IEnumerable<T>-Sammlungen ermöglicht.
Für ForEach<T> muss die Values-Eigenschaft den Typ IEnumerable<T> aufweisen. Dies schließt Benutzer davon aus, Datenstrukturen zu durchlaufen, die die IEnumerable<T>-Schnittstelle implementieren (z. B. ArrayList). Die nicht generische Version von ForEach<T> bewältigt diese Anforderung zulasten einer größeren Laufzeitkomplexität zum Sicherstellen der Kompatibilität der Typen der Werte in der Auflistung.
In diesem NonGenericForEach-Beispiel wird gezeigt, wie eine nicht generische ForEach<T>-Aktivität und der Designer implementiert werden. Diese Aktivität kann zum Durchlaufen von ArrayList verwendet werden.
ForEach-Aktivität
Die C#/Visual Basic-Anweisung foreach
zählt die Elemente einer Sammlung auf und führt eine eingebettete Anweisung für jedes Element der Sammlung 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 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 Sammlung ausgeführt wird. Jedes einzelne Element wird durch die Argument
-Eigenschaft in den Text übergeben.
Werte (optional): Die Sammlung 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 | `Message` | severity | Ausnahmetyp |
---|---|---|---|
Werte sind null |
Für das erforderliche Aktivitätsargument "Values1" wurde kein Wert angegeben. | Fehler | InvalidOperationException |
ForEach-Designer
Der Aktivitätsdesigner für das Beispiel ist dem Designer im Aussehen ähnlich, der für die integrierte ForEach<T>-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 dieses 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.