次の方法で共有


DynamicActivity の作成

このトピックの内容は、Windows Workflow Foundation 4 に該当します。

このサンプルでは、DynamicActivity アクティビティを使用して実行時にアクティビティを作成する 2 つの異なる方法を示します。

このサンプルでは、ForEach アクティビティと Assign アクティビティを含む Sequence アクティビティが本体に含まれたアクティビティを実行時に作成します。整数の入力リストがこのアクティビティに渡され、プロパティとして設定されます。次に、ForEach アクティビティは値のリストを反復処理し、累計します。Assign アクティビティでは、累計値をリスト内の要素数で除算して平均値を計算し、その値を平均に代入します。

このサンプルでは、入力引数として変数に設定され、出力引数として戻り値に設定される DynamicActivity アクティビティを使用します。このアクティビティには、整数のリストである Numbers という名前の 1 つの入力引数があります。ForEach アクティビティは値のリストを反復処理し、累計します。Assign アクティビティでは、累計値をリスト内の要素数で除算して平均値を計算し、その値を平均に代入します。平均は、Average という名前の出力引数として返されます。

動的アクティビティをプログラムで作成する場合は、次のコード例に示すように入力と出力を宣言します。

DynamicActivity act = new DynamicActivity()
{
    DisplayName = "Find average",
    Properties = 
    {
        // Input argument
        new DynamicActivityProperty
        {
            Name = "Numbers",
            Type = typeof(InArgument<List<int>>),
            Value = numbers
        },
        // Output argument
        new DynamicActivityProperty
        {
            Name = "Average",
            Type = typeof(OutArgument<double>),
            Value = average
        }
    },
};

リスト内の値の平均を計算する DynamicActivity の完全な定義を次のコード例に示します。

DynamicActivity act = new DynamicActivity()
{
    DisplayName = "Find average",
    Properties = 
    {
        // Input argument
        new DynamicActivityProperty
        {
            Name = "Numbers",
            Type = typeof(InArgument<List<int>>),
            Value = numbers
        },
        // Output argument
        new DynamicActivityProperty
        {
            Name = "Average",
            Type = typeof(OutArgument<double>),
            Value = average
        }
    },
    Implementation = () =>
        new Sequence
        {
            Variables = { result, accumulator },
            Activities =
            {
                new ForEach<int>
                {
                    Values =  new ArgumentValue<IEnumerable<int>> { ArgumentName = "Numbers" },                                
                    Body = new ActivityAction<int>
                    {
                        Argument = iterationVariable,
                        Handler = new Assign<int>
                        {
                            To = accumulator,
                            Value = new InArgument<int>(env => iterationVariable.Get(env) +  accumulator.Get(env))
                        }
                    }
                },

                // Calculate the average and assign to the output argument.
                new Assign<double>
                {
                    To = new ArgumentReference<double> { ArgumentName = "Average" },
                    Value = new InArgument<double>(env => accumulator.Get(env) / numbers.Get(env).Count<int>())
                },
            }
        }
};

XAML で作成する場合は、次の例に示すように入力と出力を宣言します。

<Activity x:Class="Microsoft.Samples.DynamicActivityCreation.FindAverage"
          xmlns="https://schemas.microsoft.com/netfx/2009/xaml/activities"
          xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
          xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <x:Members>
    <x:Property Name="Numbers" Type="InArgument(scg:List(x:Int32))" />
    <x:Property Name="Average" Type="OutArgument(x:Double)" />
  </x:Members>
    ...
    ...
</Activity>

XAML は、Windows ワークフロー デザイナー を使用して視覚的に作成できます。Visual Studio プロジェクトに含まれている場合は、"ビルド アクション" を "なし" に設定して、コンパイルされないようにしてください。その後、XAML は、次の呼び出しを使用して動的に読み込むことができます。

Activity act2 = ActivityXamlServices.Load(@"FindAverage.xaml");

プログラムによって、または XAML ワークフローを読み込むことによって作成された DynamicActivity インスタンスは、次のコード例に示すように使用できます。WorkflowInvoker.Invoke に渡される "act" は、最初のコード例で定義されている "act" Activity であることに注意してください。

IDictionary<string, object> results = WorkflowInvoker.Invoke(act, new Dictionary<string, object> { { "Numbers", numbers } });

Console.WriteLine("The average calculated using the code activity is = " + results["Average"]);

このサンプルを使用するには

  1. Visual Studio 2010 を使用して、DynamicActivityCreation.sln ソリューション ファイルを開きます。

  2. ソリューションをビルドするには、F6 キーを押します。

  3. ソリューションを実行するには、Ctrl キーを押しながら F5 キーを押します。

コマンド ライン引数

このサンプルでは、コマンド ライン引数を受け取ります。ユーザーは、アクティビティで平均を計算する対象となる数値のリストを指定できます。使用する数値のリストは、スペースで区切られた数値のリストとして渡します。たとえば、5、10、および 32 の平均を計算するには、次のコマンド ラインを使用してこのサンプルを呼び出します。

DynamicActivityCreation 5 10 32
Dd807392.Important(ja-jp,VS.100).gif 注 :
サンプルは、既にコンピューターにインストールされている場合があります。続行する前に、次の (既定の) ディレクトリを確認してください。

<InstallDrive>:\WF_WCF_Samples

このディレクトリが存在しない場合は、「.NET Framework 4 向けの Windows Communication Foundation (WCF) および Windows Workflow Foundation (WF) のサンプル」にアクセスして、Windows Communication Foundation (WCF) および WF のサンプルをすべてダウンロードしてください。このサンプルは、次のディレクトリに格納されます。

<InstallDrive>:\WF_WCF_Samples\WF\Basic\Built-InActivities\DynamicActivity\DynamicActivityCreation