Compartir vía


ForEach no genérico

.NET Framework 4.6.1 incluye en su cuadro de herramientas un conjunto de actividades del flujo de control, como la actividad ForEach<T>, que permite recorrer en iteración colecciones IEnumerable<T>.

ForEach<T> requiere que su Values propiedad sea de tipo IEnumerable<T>. Esto impide que los usuarios iteren sobre estructuras de datos que implementan la interfaz IEnumerable<T> (por ejemplo, ArrayList). La versión no genérica de ForEach<T> supera este requisito, a costa de una mayor complejidad en tiempo de ejecución para garantizar la compatibilidad de los tipos de los valores de la colección.

En el ejemplo NonGenericForEach se muestra cómo implementar una actividad no genérica ForEach<T> y su diseñador. Esta actividad se puede utilizar para recorrer en iteración ArrayList.

Actividad ForEach

La instrucción C#/Visual Basic foreach enumera los elementos de una colección, ejecutando una instrucción insertada para cada elemento de la colección. Las actividades equivalentes de WF de foreach son ForEach<T> y ParallelForEach<T>. La ForEach<T> actividad contiene una lista de valores y un contenido. En tiempo de ejecución, se recorre la lista y se ejecuta el bloque de código para cada valor de la lista.

En la mayoría de los casos, la versión genérica de la actividad debe ser la solución preferida, ya que abarca la mayoría de los escenarios en los que se usaría y proporciona la comprobación de tipos en tiempo de compilación. La versión no genérica se puede usar para recorrer en iteración los tipos que implementan la interfaz no genérica IEnumerable .

Definición de clase

En el ejemplo de código siguiente se muestra la definición de una actividad no genérica ForEach .

[ContentProperty("Body")]
public class ForEach : NativeActivity
{
    [RequiredArgument]
    [DefaultValue(null)]
    InArgument<IEnumerable> Values { get; set; }

    [DefaultValue(null)]
    [DependsOn("Values")]
    ActivityAction<object> Body { get; set; }
}

Cuerpo (opcional) La clase ActivityAction del tipo Object que se ejecuta para cada elemento en la colección. Cada elemento individual se pasa al cuerpo a través de su propiedad Argument.

Valores (opcional) La colección de elementos que se recorre en iteración. Asegurarse de que todos los elementos de la colección sean de tipos compatibles se realiza en tiempo de ejecución.

Ejemplo de uso de ForEach

En el código siguiente se muestra cómo usar la actividad ForEach en una aplicación.

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)))
           }
       }
   };
Condición Mensaje Severidad Tipo de excepción
Los valores son null No se proporcionó el valor de un argumento de actividad requerido 'Values'. Error InvalidOperationException

Diseñador de ForEach

El diseñador de actividad del ejemplo es similar en apariencia al diseñador proporcionado para la actividad integrada ForEach<T> . El diseñador aparece en el cuadro de herramientas de la categoría Ejemplos, Actividades no genéricas . El diseñador se denomina ForEachWithBodyFactory en el cuadro de herramientas, porque la actividad expone un objeto IActivityTemplateFactory en el cuadro de herramientas que crea la actividad con un objeto ActivityAction configurado correctamente.

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"
                }
            }
        };
    }
}

Para ejecutar este ejemplo

  1. Establezca el proyecto que prefiera como proyecto de inicio de la solución:

    1. CodeTestClient muestra cómo usar la actividad mediante código.

    2. DesignerTestClient muestra cómo usar la actividad dentro del diseñador.

  2. Compile y ejecute el proyecto.