Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
Defina o projeto de sua escolha como o projeto inicial da solução:
CodeTestClient mostra como usar a atividade usando código.
DesignerTestClient mostra como usar a atividade dentro do designer.
Crie e execute o projeto.