Compartir a través de


ForEach no genérico

Este tema es aplicable a Windows Workflow Foundation 4.

.NET Framework versión 4 incluye en su cuadro de herramientas un conjunto de actividades Control Flow, como la actividad ForEach, que permite recorrer en iteración colecciones IEnumerable.

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

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

Actividad ForEach

La instrucción foreach de C#/VB enumera los elementos de una colección y ejecuta una instrucción incrustada para cada elemento de la colección. Las actividades equivalentes de foreach de WF son ForEach y ParallelForEach. La actividad ForEach contiene una lista de valores y un cuerpo. En el tiempo de ejecución, la lista se recorre en iteración y se ejecuta el cuerpo 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, porque abarca la mayoría de los escenarios en los que se puede utilizar y proporciona comprobación de tipos en tiempo de compilación. La versión no genérica se puede utilizar para recorrer en iteración tipos que implementan la interfaz IEnumerable no genérica.

Definición de clase

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

[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)
    ActivityAction de 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. La verificación de que todos los elementos de la colección son de tipos compatibles se realiza en el tiempo de ejecución.

Ejemplo de uso de ForEach

El siguiente código muestra cómo utilizar 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 Gravedad Tipo de excepción

Los valores son null

No se proporcionó el valor para un argumento de actividad necesario 'Values'.

Error

InvalidOperationException

Diseñador de ForEach

El diseñador de actividad del ejemplo es similar en aspecto al diseñador proporcionado para la actividad ForEach integrada. El diseñador aparece en el cuadro de herramientas en 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 desee como el proyecto de inicio de la solución:

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

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

  2. Compile y ejecute el proyecto.

Ee834519.Important(es-es,VS.100).gif Nota:
Puede que los ejemplos ya estén instalados en su equipo. Compruebe el siguiente directorio (valor predeterminado) antes de continuar.

<unidadDeInstalación>:\WF_WCF_Samples

Si no existe este directorio, vaya a la página de ejemplos de Windows Communication Foundation (WCF) y Windows Workflow Foundation (WF) Samples para .NET Framework 4 para descargar todos los ejemplos de WF y Windows Communication Foundation (WCF). Este ejemplo se encuentra en el siguiente directorio.

<unidadDeInstalación>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericForEach