1. 程式人生 > >WF4.0 基礎篇 (八) 控制流Activity

WF4.0 基礎篇 (八) 控制流Activity

本節主要介紹IF, Switch<T>, While, DoWhile, ForEach<T> 的使用.

本文例子下載:

http://files.cnblogs.com/foundation/controlActivitySample.rar

本文例子說明

控制流Activity

IF 條件

類名

System.Activities.Statements.If

檔案

System.Activities.dll

結構說明

繼承 NativeActivity

是一個 sealed類

override 了 [CacheMetadata方法] 與 [Execute方法]

[Condition]屬性的型別為[ System.Activities.InArgument<bool> ],可以接受一個結果為[bool]的表示式

[Then] 屬性 的型別為[System.Activities.Activity]

[Else] 屬性 的型別為[System.Activities.Activity]

功能說明

[Then] 屬性 Activity型別,如果[Condition]的表示式結果為[True],執行[Then]否則執行[Else]

例:

1. 在流程中新增string變數[myVariable]

2. 新增[Assign]為變數[myVariable]賦值"wxd"

3. 新增[If],[Condition]的表示式為[ myVariable = "wxd" ]

4. 在[If]的[Then]中新增[WriteLine]列印[ "Then:" + myVariable ]

在[If]的[Else]中新增[WriteLine]列印[ "Else:" + myVariable ]

流程

宿主

WorkflowInvoker.Invoke(new IfWorkflow());

結果

Switch<T> 分支

類名

System.Activities.Statements.Switch<T>

檔案

System.Activities.dll

結構說明

繼承 NativeActivity

是一個 sealed類

override 了 [CacheMetadata方法] 與 [Execute方法]

[Expression]屬性的型別為[System.Activities.InArgument<T>],是case的 表示式

[Default] 屬性 的型別為[System.Activities.Activity]

[Cases] 屬性 的型別為[IDictionary<T, Activity>]

功能說明

在新增[Switch<T>]時,需要為case 表示式 [Expression屬性]  指定型別

[Switch]會比效[Expression]的值與[Case集合]中每個分支值,如果有相等的就執行該分支,如果沒的相等的就執行[Default]

[Switch]會自動檢查[Case集合]中是否有相同的分支條件

例:

1. 在流程中新增string變數[myVariable]

2. 新增[Assign]為變數[myVariable]賦值"wxwinter"

3. 新增[Switch],[Expression]的表示式型別為[string],內容為[ myVariable]

4. 在[Default]中新增[WriteLine]列印["Case Default :" + myVariable ]

新增[case],值為"wxd",在新新增的[case] 中新增[WriteLine]列印["Case wxd :" + myVariable]

新增[case],值為"lzm",在新新增的[case] 中新增[WriteLine]列印["Case lzm :" + myVariable]

流程

宿主

WorkflowInvoker.Invoke(new SwitchWorkflow());

結果

While 迴圈

類名

System.Activities.Statements.While

檔案

System.Activities.dll

結構說明

繼承 NativeActivity

是一個 sealed類

override 了 [CacheMetadata方法] 與 [Execute方法]

[Variables] 屬性 的型別為[Collection<Variable>]

[Condition]屬性 的型別為[Activity<bool>],可以接受一個結果為[bool]的表示式

[Body] 屬性 的型別為[System.Activities.Activity]

功能說明

[While]中可以定義變數

當[Condition]條件為真時會執行[Body]中的內容

例:

1. 在流程中新增int變數[myVariable]

2. 新增[While],[Condition]的表示式為[myVariable<=10]

3. 在[While]的[Body]中新增[Assign],為變數[myVariable]賦值為 [myVariable + 1]

新增[WriteLine]列印變數[myVariable]的值

流程

宿主

WorkflowInvoker.Invoke(new WhileWorkflow());

結果

DoWhile 迴圈

類名

System.Activities.Statements.DoWhile

檔案

System.Activities.dll

結構說明

繼承 NativeActivity

是一個 sealed類

override 了 [CacheMetadata方法] 與 [Execute方法]

[Variables] 屬性 的型別為[Collection<Variable>]

[Condition]屬性 的型別為[Activity<bool>],可以接受一個結果為[bool]的表示式

[Body] 屬性 的型別為[System.Activities.Activity]

功能說明

[DoWhile]中可以定義變數

當[Condition]條件為真時會執行[Body]中的內容, 當[Condition]條件為假時會執行[Body]中的內容一次

例:

1. 新增[DoWhile],[Condition]的表示式為[False]

2. 在[DoWhile]的[Body] 新增[WriteLine]列印"wxwinter"

流程

宿主

WorkflowInvoker.Invoke(new DoWhileWorkflow());

結果

ForEach<T> 迴圈

類名

System.Activities.Statements.ForEach<T>

檔案

System.Activities.dll

結構說明

繼承 NativeActivity

是一個 sealed類

override 了 [CacheMetadata方法] 與 [Execute方法]

[Body] 屬性 的型別為[ActivityAction<T>]

[Values] 屬性 的型別為[ InArgument<IEnumerable<T>> ]

功能說明

[Values] 屬性為要迴圈的集合

[TypeArgument] 為要迴圈集合的的型別

[item]為迴圈時的臨時變數,可在[Body]中被訪問

例:

1. 建立一code activity 名為[CollectionActivity],

具有[Out]引數,型別為List<string>的引數[myOutCollection]

2. 在流程中新增List<string>變數[myCollection]

3. 在流程中新增[CollectionActivity],將[CollectionActivity.myOutCollection]引數繫結到 [myCollection] 變數

4. 在流程中新增[ForEach<T>],[TypeArgument]屬性指定[string] 

   [Values] 屬性繫結到 [myCollection] 變數

   在[Body]中新增[writeLine],列印[item]

CollectionActivity

public sealed class CollectionActivity : CodeActivity

    {

public OutArgument<System.Collections.Generic.List<string>> myOutCollection { get; set; }

protected override void Execute(CodeActivityContext context)

        {

           System.Collections.Generic.List<string> list = new List<string>();

           list.Add("wxd");

           list.Add("lzm");

           list.Add("wxwinter");

           context.SetValue (this.myOutCollection,list );

        }

    }

流程

宿主

WorkflowInvoker.Invoke(new ForEachWorkflow());

結果