WF4.0 基础篇(二十九) WorkflowInspectionServices2012-08-22 博客园 WXWinter(冬)WorkflowInspectionServices 类WorkflowInspectionServices可以得到流程中的Activity,由于WF4.0的ActivityTree相对复杂,并不是象 WF3.X的结构那样清晰, 在WF4.0中Activitys,Body,Implementation等了Activity属性比效多,要循环Activity 就要做很多判断,这时可以使用WorkflowInspectionServices得到ActivityTree上的所有Activity.WorkflowInspectionServices可自动判断Activitys,Body,Implementation等与自已实现递归相比,自已实现递归可以操作更多细节,WorkflowInspectionServices则可以快速得到全部 Activity注意:由于WorkflowInspectionServices只得到Activity,所以流程图中的FlowNodeFlowStepFlowSwitchFlowDecision不是从Activity中继承的,所以WorkflowInspectionServices无法得到这些元素,但这些元素中所包含的 Activity可以得到

静态方法 GetActivities 基本功能基于XAML文件名得到Activity:static Activity getActivity(string filePathName){string valueString = "";using (System.IO.FileStream fileStream = new System.IO.FileStream(filePathName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)){using (System.IO.StreamReader streamReader = new System.IO.StreamReader (fileStream)){valueString = streamReader.ReadToEnd();}}System.IO.StringReader stringReader = new System.IO.StringReader(valueString);Activity activity = System.Activities.XamlIntegration.ActivityXamlServices.Load (stringReader);WorkflowInspectionServices.CacheMetadata(activity);return activity;}GetActivities方式:
static void printActivityTree(Activity activity,string tag)
{
Console.WriteLine(tag + "{0},type:{1}", activity.DisplayName, activity.GetType ());
System.Collections.Generic.IEnumerator<Activity> list = WorkflowInspectionServices.GetActivities(activity).GetEnumerator();
while (list.MoveNext())
{
printActivityTree(list.Current," "+ tag );
}
}