Compartilhar via


Expressões (WF)

Uma expressão do WF (Windows Workflow Foundation) é qualquer atividade que retorna um resultado. Todas as atividades de expressão derivam indiretamente de Activity<TResult>, que contém uma propriedade de OutArgument nomeada Result como o valor de retorno da atividade. O WF é fornecido com uma ampla gama de atividades de expressão simples como VariableValue<T> e VariableReference<T>, que fornecem acesso à variável única de fluxo de trabalho por meio de atividades do operador, a atividades complexas como VisualBasicReference<TResult> e VisualBasicValue<TResult> que oferecem acesso à largura máxima da linguagem Visual Basic para produzir o resultado. As atividades adicionais da expressão podem ser criadas derivando de CodeActivity<TResult> ou NativeActivity<TResult>.

Usando expressões

O designer de fluxo de trabalho usa VisualBasicValue<TResult> e VisualBasicReference<TResult> para todas as expressões em projetos do Visual Basic, e CSharpValue<TResult> e CSharpReference<TResult> para expressões em projetos de fluxo de trabalho C#.

Observação

O suporte para expressões C# em projetos de fluxo de trabalho foi introduzido no .NET Framework 4.5. Para obter mais informações, confira Expressões em C#.

Os fluxos de trabalho gerados pelo designer são salvos em XAML, onde as expressões aparecem incluídas entre colchetes, como no exemplo a seguir.

<Sequence xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Sequence.Variables>
    <Variable x:TypeArguments="x:Int32" Default="1" Name="a" />
    <Variable x:TypeArguments="x:Int32" Default="2" Name="b" />
    <Variable x:TypeArguments="x:Int32" Default="3" Name="c" />
    <Variable x:TypeArguments="x:Int32" Default="0" Name="r" />
  </Sequence.Variables>
  <Assign>
    <Assign.To>
      <OutArgument x:TypeArguments="x:Int32">[r]</OutArgument>
    </Assign.To>
    <Assign.Value>
      <InArgument x:TypeArguments="x:Int32">[a + b + c]</InArgument>
    </Assign.Value>
  </Assign>
</Sequence>

Ao definir um fluxo de trabalho em código, as atividades de expressão podem ser usadas. O seguinte exemplo mostra o uso de uma combinação de atividades do operador para adicionar três números:

Variable<int> a = new Variable<int>("a", 1);
Variable<int> b = new Variable<int>("b", 2);
Variable<int> c = new Variable<int>("c", 3);
Variable<int> r = new Variable<int>("r", 0);

Sequence w = new Sequence
{
    Variables = { a, b, c, r },
    Activities =
    {
        new Assign {
            To = new OutArgument<int>(r),
            Value = new InArgument<int> {
                Expression = new Add<int, int, int> {
                    Left = new Add<int, int, int> {
                        Left = new InArgument<int>(a),
                        Right = new InArgument<int>(b)
                    },
                    Right = new InArgument<int>(c)
                }
            }
        }
    }
};

O mesmo fluxo de trabalho pode ser expresso de modo mais compacto usando expressões lambda C#, conforme mostrado no seguinte exemplo:

Variable<int> a = new Variable<int>("a", 1);
Variable<int> b = new Variable<int>("b", 2);
Variable<int> c = new Variable<int>("c", 3);
Variable<int> r = new Variable<int>("r", 0);

Sequence w = new Sequence
{
    Variables = { a, b, c, r },
    Activities =
    {
        new Assign {
            To = new OutArgument<int>(r),
            Value = new InArgument<int>((ctx) => a.Get(ctx) + b.Get(ctx) + c.Get(ctx))
        }
    }
};

Estendendo expressões disponíveis com atividades da expressão personalizadas

As expressões do .NET Framework 4.6.1 são extensíveis, permitindo a criação de atividades adicionais da expressão. O exemplo a seguir mostra uma atividade que retorna uma soma de três valores inteiros.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;

namespace ExpressionsDemo
{
    public sealed class AddThreeValues : CodeActivity<int>
    {
        public InArgument<int> Value1 { get; set; }
        public InArgument<int> Value2 { get; set; }
        public InArgument<int> Value3 { get; set; }

        protected override int Execute(CodeActivityContext context)
        {
            return Value1.Get(context) +
                   Value2.Get(context) +
                   Value3.Get(context);
        }
    }
}

Com essa nova atividade, você pode reescrever o fluxo de trabalho anterior que adicionou três valores conforme mostrado no seguinte exemplo:

Variable<int> a = new Variable<int>("a", 1);
Variable<int> b = new Variable<int>("b", 2);
Variable<int> c = new Variable<int>("c", 3);
Variable<int> r = new Variable<int>("r", 0);

Sequence w = new Sequence
{
    Variables = { a, b, c, r },
    Activities =
    {
        new Assign {
            To = new OutArgument<int>(r),
            Value = new InArgument<int> {
                Expression = new AddThreeValues() {
                    Value1 = new InArgument<int>(a),
                    Value2 = new InArgument<int>(b),
                    Value3 = new InArgument<int>(c)
                }
            }
        }
    }
};

Para obter mais informações sobre como usar expressões no código, confira Como criar fluxos de trabalho, atividades e expressões usando um código imperativo.