非ジェネリックの ForEach
.NET Framework 4.6.1 のツールボックスには、制御フロー アクティビティのセットが用意されています。これには、IEnumerable<T> コレクションを反復処理できる ForEach<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; }
}
Body (省略可能) コレクション内の要素ごとに実行される ActivityAction 型の Object。 各要素は、Argument
プロパティを使用して Body に渡されます。
Values (省略可能) 反復処理される要素のコレクション。 コレクションのすべての要素の型が互換性のある型であることが実行時に確認されます。
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)))
}
}
};
条件 | Message | 重大度 | 例外の種類 |
---|---|---|---|
値が null である |
必須のアクティビティ引数 'Values' の値が指定されませんでした。 | エラー | InvalidOperationException |
ForEach デザイナー
サンプルのアクティビティ デザイナーは、組み込みの ForEach<T> アクティビティ用に提供されているデザイナーに外観が似ています。 このデザイナーは、ツールボックスの [サンプル] の [非ジェネリック アクティビティ] カテゴリにあります。 このデザイナーのツールボックスにおける名前は ForEachWithBodyFactory です。これは、適切に構成された ActivityAction を使用してアクティビティを作成する IActivityTemplateFactory がツールボックスでアクティビティによって公開されるためです。
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"
}
}
};
}
}
このサンプルを実行するには
選択したプロジェクトをソリューションのスタートアップ プロジェクトに設定します。
CodeTestClient は、コードを使用したアクティビティの使用方法を示します。
DesignerTestClient は、デザイナー内でアクティビティを使用する方法を示します。
プロジェクトをビルドして実行します。
.NET