次の方法で共有


式 (WF)

Windows Workflow Foundation (WF) の式は、結果を返す任意のアクティビティです。 すべての式アクティビティは、アクティビティの戻り値として Activity<TResult> という名前の OutArgument プロパティを含む Result から間接的に派生します。 WF には、幅広い式アクティビティが用意されています。式アクティビティは、演算子アクティビティを介して 1 つのワークフロー変数へアクセスできる VariableValue<T>VariableReference<T> などの単純なアクティビティから、結果を生成するために Visual Basic 言語一式へアクセスできる VisualBasicReference<TResult>VisualBasicValue<TResult> などの複雑なアクティビティまでさまざまです。 追加の式アクティビティは、CodeActivity<TResult> または NativeActivity<TResult> から派生して作成できます。

式の使用

ワークフロー デザイナーでは、Visual Basic プロジェクトのすべての式に VisualBasicValue<TResult> および VisualBasicReference<TResult>、C# ワークフロー プロジェクトの式に CSharpValue<TResult> および CSharpReference<TResult> を使用します。

注意

ワークフロー プロジェクトでの C# 式のサポートは、.NET Framework 4.5 で導入されました。 詳細については、「C# の式」を参照してください。

デザイナーによって生成されたワークフローは XAML に保存されます。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>

コードでワークフローを定義すると、任意の式アクティビティを使用できます。 次の例は、3 つの数値を加算する演算子アクティビティの組み合わせを使用する方法を示しています。

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 の式には、追加の式アクティビティを作成できる拡張性があります。 次のコードは、3 つの整数値の合計を返すアクティビティの例です。

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

この新しいアクティビティを使用すると、次の例に示すように、3 つの値を加算した前のワークフローを書き直すことができます。

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

コード内で式を使用する方法の詳細については、「命令型コードを使用してワークフロー、アクティビティ、および式を作成する方法」を参照してください。