.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; }
}
Body (選擇性) 類型為 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 |
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 示範如何使用設計工具內的活動。
建置並執行專案。