.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; }
}
正文(可选) ActivityAction 类型的 Object,将对集合中的每个元素执行它。 每个单个元素通过其 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 |
ForEachT 设计器
此示例的活动设计器的外观与为内置 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 演示如何使用设计器中的活动。
生成并运行该项目。