Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Выражение 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)
}
}
}
}
};
Дополнительные сведения об использовании выражений в коде см. в статье "Создание рабочих процессов, действий и выражений с помощью императивного кода".