.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
문은 컬렉션의 각 요소에 대해 포함된 문을 실행하여 컬렉션의 요소를 열거합니다. WF에 해당하는 활동은 foreach
의 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; }
}
본문(선택 사항) ActivityAction 컬렉션의 각 요소에 대해 실행되는 형식 Object입니다. 각 개별 요소는 해당 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> 활동에 대해 제공된 디자이너와 모양이 비슷합니다. 디자이너는 샘플, 제네릭이 아닌 활동 범주의 도구 상자에 나타납니다. 디자이너는 도구 상자에서 ForEachWithBodyFactory라는 이름을 가지고 있습니다. 이는 활동이 도구 상자에 IActivityTemplateFactory을 노출하여, 제대로 구성된 ActivityAction로 활동을 생성하기 때문입니다.
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