다음을 통해 공유


비제네릭 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; }
}

본문(선택 사항) 컬렉션의 각 요소에 대해 실행되는 Object 형식의 ActivityAction입니다. 각 개별 요소는 Argument 속성을 통해 본문에 전달됩니다.

값(선택 사항) 반복되는 요소의 컬렉션입니다. 컬렉션의 모든 요소가 호환 가능한 형식인지 확인하는 작업은 런타임에 수행됩니다.

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> 활동에 제공되는 디자이너와 모양이 비슷합니다. 디자이너는 샘플, 비제네릭 활동 범주의 도구 상자에 나타납니다. ActivityAction이 제대로 구성된 활동을 만드는 IActivityTemplateFactory가 활동을 통해 도구 상자에 노출되기 때문에 도구 상자에서 디자이너의 이름이 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. 프로젝트를 빌드하고 실행합니다.