ForEach non generica
Nella casella degli strumenti di .NET Framework 4.6.1 è disponibile un set di attività del flusso di controllo, inclusa ForEach<T> che consente di scorrere le raccolte IEnumerable<T>.
L'oggetto ForEach<T> richiede che la relativa proprietà Values sia di tipo IEnumerable<T>. In questo modo, gli utenti non possono scorrere le strutture di dati che implementano l'interfaccia IEnumerable<T> (ad esempio l'oggetto ArrayList). La versione non generica dell'oggetto ForEach<T> supera questo requisito, a discapito di una maggiore complessità della fase di esecuzione per assicurare la compatibilità dei tipi dei valori nella raccolta.
Nell’esempio di NonGenericForEach viene illustrato come implementare un'attività ForEach<T> non generica e la relativa finestra di progettazione. Questa attività può essere usata per scorrere l'oggetto ArrayList.
Attività ForEach
L'istruzione foreach
di C#/Visual Basic enumera gli elementi di una raccolta eseguendo un'istruzione incorporata per ogni elemento della raccolta. Le attività WF equivalenti di foreach
sono ForEach<T> e ParallelForEach<T>. L'attività ForEach<T> contiene un elenco di valori e un corpo. In fase di esecuzione, viene scorso l'elenco e il corpo viene eseguito per ogni valore dell'elenco.
Nella maggior parte dei casi, la versione generica dell'attività deve essere la soluzione preferita, poiché concerne la maggioranza degli scenari in cui verrà usata e fornisce il controllo dei tipi in fase di compilazione. La versione non generica può essere usata per scorrere i tipi che implementano l'interfaccia IEnumerable non generica.
Definizione della classe
Nell'esempio di codice seguente viene illustrata la definizione di un'attività ForEach
non generica.
[ContentProperty("Body")]
public class ForEach : NativeActivity
{
[RequiredArgument]
[DefaultValue(null)]
InArgument<IEnumerable> Values { get; set; }
[DefaultValue(null)]
[DependsOn("Values")]
ActivityAction<object> Body { get; set; }
}
Corpo (facoltativo) Oggetto ActivityAction di tipo Object eseguito per ogni elemento della raccolta. Ogni singolo elemento viene passato al corpo tramite la proprietà Argument
.
Valori (facoltativo) Raccolta di elementi che vengono scorsi. In fase di esecuzione si verifica che tutti gli elementi della raccolta siano di tipi compatibili.
Esempio di utilizzo di ForEach
Nel codice seguente viene illustrato come usare l'attività ForEach in un'applicazione.
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)))
}
}
};
Condizione | Message | Gravità | Tipo di eccezione |
---|---|---|---|
I valori sono null |
Valore non specificato per un argomento di attività 'Values' obbligatorio. | Error | InvalidOperationException |
Finestra di progettazione ForEach
L'aspetto dell'ActivityDesigner per l'esempio è simile a quello della finestra di progettazione fornita per l'attività ForEach<T> incorporata. La finestra di progettazione viene visualizzata nella categoria Esempi, Attività non generiche della casella degli strumenti. La finestra di progettazione viene denominata ForEachWithBodyFactory nella casella degli strumenti, poiché l'attività espone un oggetto IActivityTemplateFactory nella casella degli strumenti che crea l'attività con un oggetto ActivityAction correttamente configurato.
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"
}
}
};
}
}
Per eseguire questo esempio
Impostare il progetto scelto come progetto di avvio della soluzione:
In CodeTestClient viene illustrato come usare l'attività tramite codice.
In DesignerTestClient viene illustrato come usare l'attività all'interno della finestra di progettazione.
Compilare ed eseguire il progetto.