Partilhar via


ForEach não genérico

O .NET Framework 4.6.1 inclui na sua caixa de ferramentas um conjunto de atividades de Fluxo de Controle, incluindo ForEach<T>, que permite iterar por coleções.

ForEach<T> requer que sua Values propriedade seja do tipo IEnumerable<T>. Isto impossibilita que os utilizadores iterem sobre estruturas de dados que implementam a interface IEnumerable<T> (por exemplo, ArrayList). A versão não genérica de ForEach<T> supera este requisito, à custa de uma maior complexidade em tempo de execução para garantir a compatibilidade dos tipos de valores na coleção.

O exemplo NonGenericForEach mostra como implementar uma atividade não genérica ForEach<T> e seu designer. Esta atividade pode ser usada para iterar através do ArrayList.

Atividade ForEach

A instrução C#/Visual Basic foreach enumera os elementos de uma coleção, executando uma instrução incorporada para cada elemento da coleção. As atividades equivalentes do WF de foreach são ForEach<T> e ParallelForEach<T>. A ForEach<T> atividade contém uma lista de valores e um corpo. Em tempo de execução, a lista é percorrida e o bloco de código é executado para cada valor da lista.

Para a maioria dos casos, a versão genérica da atividade deve ser a solução preferida, porque cobre a maioria dos cenários em que seria usada e fornece verificação de tipo em tempo de compilação. A versão não genérica pode ser usada para percorrer tipos que implementam a interface não genérica IEnumerable.

Definição de classe

O exemplo de código a seguir mostra a definição de uma atividade não 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; }
}

Corpo (opcional) O ActivityAction do tipo Object, que é executado para cada elemento da coleção. Cada elemento individual é passado para o Corpo através da sua Argument propriedade.

Valores (opcional) A coleção de elementos que são iterados. Garantir que todos os elementos da coleção são de tipos compatíveis é feito em tempo de execução.

Exemplo de uso de ForEach

O código a seguir demonstra como usar a atividade ForEach em um aplicativo.

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)))
           }
       }
   };
Condição Mensagem Severidade Tipo de Exceção
Os valores são null O valor para um argumento de atividade necessária 'Valores' não foi fornecido. Erro InvalidOperationException

Desenhador ForEach

O criador de atividades para o exemplo é similar na aparência ao criador fornecido para a atividade embutida ForEach<T>. O designer aparece na caixa de ferramentas na categoria Exemplos, Atividades não genéricas . O designer é chamado ForEachWithBodyFactory na caixa de ferramentas, porque a atividade disponibiliza um IActivityTemplateFactory que cria a atividade com um ActivityAction devidamente configurado.

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 executar este exemplo

  1. Defina o projeto de sua escolha como o projeto inicial da solução:

    1. CodeTestClient mostra como usar a atividade usando código.

    2. DesignerTestClient mostra como usar a atividade dentro do designer.

  2. Crie e execute o projeto.