次の方法で共有


非ジェネリック ForEach

.NET Framework 4.6.1 には、 ForEach<T>を含む一連の制御フロー アクティビティがツールボックスに付属しています。これにより、 IEnumerable<T> コレクションを反復処理できます。

ForEach<T> には、その Values プロパティが IEnumerable<T>型である必要があります。 これにより、ユーザーは、 IEnumerable<T> インターフェイス (たとえば、 ArrayList) を実装するデータ構造を反復処理できなくなります。 ForEach<T>の非ジェネリック バージョンは、コレクション内の値の型の互換性を確保するための実行時の複雑さを犠牲にして、この要件を克服します。

NonGenericForEach サンプルは、非ジェネリック ForEach<T> アクティビティとそのデザイナーを実装する方法を示しています。 このアクティビティは、 ArrayListを反復処理するために使用できます。

ForEach アクティビティ

C#/Visual Basic foreach ステートメントはコレクションの要素を列挙し、コレクションの各要素に対して埋め込みステートメントを実行します。 foreachの WF と同等のアクティビティはForEach<T>され、ParallelForEach<T>されます。 ForEach<T> アクティビティには、値と本文の一覧が含まれています。 実行時に、リストが反復処理され、リスト内の各値に対して本文が実行されます。

ほとんどの場合、アクティビティの一般的なバージョンが推奨されるソリューションである必要があります。これは、アクティビティが使用されるシナリオの大部分をカバーし、コンパイル時に型チェックを提供するためです。 非ジェネリック バージョンは、非ジェネリック IEnumerable インターフェイスを実装する型を反復処理するために使用できます。

クラス定義

次のコード例は、非ジェネリック ForEach アクティビティの定義を示しています。

[ContentProperty("Body")]
public class ForEach : NativeActivity
{
    [RequiredArgument]
    [DefaultValue(null)]
    InArgument<IEnumerable> Values { get; set; }

    [DefaultValue(null)]
    [DependsOn("Values")]
    ActivityAction<object> Body { get; set; }
}

本文 (省略可能) コレクション内の各要素に対して実行されるObject型のActivityAction。 各要素は、 Argument プロパティを介して Body に渡されます。

値 (省略可能) 反復処理される要素のコレクション。 コレクションのすべての要素が互換性のある型であることを確認することは、実行時に行われます。

ForEach の使用例

次のコードは、アプリケーションで ForEach アクティビティを使用する方法を示しています。

string[] names = { "bill", "steve", "ray" };

DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };

Activity sampleUsage =
    new ForEach
    {
       Values = new InArgument<IEnumerable>(c=> names),
       Body = new ActivityAction<object>
       {
           Argument = iterationVariable,
           Handler = new WriteLine
           {
               Text = new InArgument<string>(env => string.Format("Hello {0}",                                                               iterationVariable.Get(env)))
           }
       }
   };
条件 メッセージ 深刻さ 例外の種類
値は次のとおりです。 null 必要なアクティビティ引数 'Values' の値が指定されませんでした。 エラー InvalidOperationException

ForEach デザイナー

サンプルのアクティビティ デザイナーの外観は、組み込みの ForEach<T> アクティビティに対して提供されるデザイナーと似ています。 デザイナーは、[ サンプル] の [ 一般的でないアクティビティ ] カテゴリのツールボックスに表示されます。 このアクティビティはツールボックス内のIActivityTemplateFactoryを公開し、適切に構成されたActivityActionでアクティビティを作成するため、デザイナーの名前はツールボックスの ForEachWithBodyFactory です。

public sealed class ForEachWithBodyFactory : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new Microsoft.Samples.Activities.Statements.ForEach()
        {
            Body = new ActivityAction<object>()
            {
                Argument = new DelegateInArgument<object>()
                {
                    Name = "item"
                }
            }
        };
    }
}

このサンプルを実行するには

  1. 選択したプロジェクトをソリューションのスタートアップ プロジェクトとして設定します。

    1. CodeTestClient は、 コードを使用してアクティビティを使用する方法を示しています。

    2. DesignerTestClient は、 デザイナー内でアクティビティを使用する方法を示しています。

  2. プロジェクトをビルドして実行します。