Поделиться через


Выражения

Данный раздел относится к версии Windows Workflow Foundation 4.

Выражением Windows Workflow Foundation (WF) является любое действие, которое возвращает результат. Все действия выражения косвенно наследуются от Activity, которое содержит OutArgument свойство с именем Result как возвращаемое значение действия. WF поставляется с широким диапазоном действий выражений, начиная от простых, таких как VariableValue и VariableReference, которые обеспечивают доступ к одной переменной рабочего процесса с помощью действий оператора, и заканчивая сложными, подобными VisualBasicReference и VisualBasicValue, которые обеспечивают доступ ко всем возможностям языка Visual Basic, что позволяет добиться нужного результата. Дополнительные действия выражения можно создать путем наследования от CodeActivity или NativeActivity.

Использование выражений

Конструктор рабочих процессов использует VisualBasicValue и VisualBasicReference для всех выражений. Именно поэтому в текстовых полях выражения конструктора должен использоваться синтаксис Visual Basic. Рабочие процессы, которые создаются конструктором, сохраняются в XAML, в котором выражения отображаются в квадратных скобках, как показано в следующем примере.

<Sequence xmlns="https://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:x="https://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>

При определении рабочего процесса в коде можно использовать любое действие выражения. В следующем примере показано использование способа создания действий оператора для сложения трех чисел.

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

Этот же рабочий процесс может быть выражен более компактно с помощью лямбда-выражений C#, как показано в следующем примере.

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

Также рабочий процесс можно выразить с помощью действий выражений Visual Basic, как показано в следующем примере.

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>(new VisualBasicValue<int>("a + b + c"))
        }
    }
};

Расширение доступных выражений с помощью настраиваемых действий выражения

Выражения в .NET Framework 4 можно расширить, что позволит создавать дополнительные действия выражения. В следующем примере показано действие, которое возвращает сумму трех целочисленных значений.

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

С помощью этого нового действия можно переписать предыдущий рабочий процесс, в котором складывались три значения, как показано в следующем примере.

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

Дополнительные сведения об использовании выражений в коде см. в разделе Разработка рабочих процессов с помощью императивного кода.