Freigeben über


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

InvalidOperationException

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

  1. Legen Sie das Projekt Ihrer Wahl als Startprojekt der Projektmappe fest:

    1. CodeTestClient zeigt, wie die Aktivität mit Code verwendet wird.

    2. DesignerTestClient zeigt, wie die Aktivität im Designer verwendet wird.

  2. Erstellen Sie das Projekt, und führen Sie es aus.

Ee834519.Important(de-de,VS.100).gif 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