Выражения (WF)
Выражение Windows Workflow Foundation (WF) — это любое действие, которое возвращает результат. Все действия выражений косвенно наследуются от класса Activity<TResult>, который содержит свойство OutArgument с именем Result в качестве значения, возвращаемого действием. WF поставляется с широким спектром действий выражений от простых, таких VariableValue<T> как и VariableReference<T>, которые обеспечивают доступ к одной переменной рабочего процесса через действия оператора, к сложным действиям, таким как VisualBasicReference<TResult> и VisualBasicValue<TResult> которые предлагают доступ к полному диапазону языка Visual Basic для получения результата. Дополнительные действия выражения можно создать путем наследования от CodeActivity<TResult> или NativeActivity<TResult>.
Использование выражений
Конструктор рабочих процессов использует VisualBasicValue<TResult> и VisualBasicReference<TResult> для всех выражений в проектах Visual Basic CSharpValue<TResult> и CSharpReference<TResult> для выражений C# в проектах рабочих процессов.
Примечание.
Поддержка выражений C# в проектах рабочих процессов появилась в платформа .NET Framework 4.5. Дополнительные сведения см. в разделе "Выражения C#".
Рабочие процессы, которые создаются конструктором, сохраняются в XAML, в котором выражения отображаются в квадратных скобках, как показано в следующем примере.
<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>
При определении рабочего процесса в коде можно использовать любое действие выражения. В следующем примере показано использование композиции действий оператора для добавления трех чисел:
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))
}
}
};
Расширение доступных выражений с помощью настраиваемых действий выражения
Выражения в платформа .NET Framework 4.6.1 расширяемы, что позволяет создавать дополнительные действия выражений. В следующем примере показано действие, которое возвращает сумму трех целочисленных значений.
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)
}
}
}
}
};
Дополнительные сведения об использовании выражений в коде см. в статье "Создание рабочих процессов, действий и выражений с помощью императивного кода".