如何在Windows Workflow Foundation Switch Activity中使用非常量表达式分支
嘿,我刚好折腾过WF里的这种灵活分支场景,完全懂你想实现类似C# switch(true) 那种基于动态条件的分支逻辑,给你梳理两种最实用的实现方式:
方法一:用Switch Activity实现(结构化分支)
WF默认的Switchbool类型的Switch来模拟动态条件分支:
前置处理空输入
先拖一个IfActivity到工作流最开头,设置它的Condition为:string.IsNullOrEmpty(userInput)在
Then分支里放TerminateWorkflow(或者Return,如果是函数型工作流),直接终止流程。配置Switch
核心逻辑 - 拖一个
Switch<bool>Activity到If的Else分支里,把Switch的Expression属性设为true(我们要匹配true的分支)。 - 给Switch添加多个Case分支,每个分支的
CaseValue都设为true。 - 重点来了:给每个Case分支的ActivityAction设置
Condition属性,输入你对应的条件表达式:- 第一个分支Condition:
userInput.Contains("hey") - 第二个分支Condition:
userInput.Contains("what") && userInput.Contains("man") - 第三个分支Condition:
userInput.Contains("you") - 以此类推
- 第一个分支Condition:
- 每个Case的
Handler里放对应的WriteLineActivity,输出你要的内容。
- 拖一个
(可选)添加默认分支
如果所有条件都不满足,可以给Switch设置Default分支,处理兜底逻辑。
代码示例(代码方式构建工作流)
// 定义工作流变量 Variable<string> userInput = new Variable<string>(); // 构建工作流 Sequence workflow = new Sequence() { Variables = { userInput }, Activities = { // 读取用户输入 new Assign<string>() { To = userInput, Value = new InArgument<string>(ctx => Console.ReadLine()) }, // 判断输入是否为空 new If() { Condition = new InArgument<bool>(ctx => string.IsNullOrEmpty(userInput.Get(ctx))), Then = new TerminateWorkflow() { Reason = "User input is empty or null" }, Else = new Switch<bool>() { Expression = new InArgument<bool>(ctx => true), Cases = { { true, new ActivityAction<bool>() { Condition = new InArgument<bool>(ctx => userInput.Get(ctx).Contains("hey")), Handler = new WriteLine() { Text = "Got hey" } } }, { true, new ActivityAction<bool>() { Condition = new InArgument<bool>(ctx => userInput.Get(ctx).Contains("what") && userInput.Get(ctx).Contains("man")), Handler = new WriteLine() { Text = "Got what man" } } }, { true, new ActivityAction<bool>() { Condition = new InArgument<bool>(ctx => userInput.Get(ctx).Contains("you")), Handler = new WriteLine() { Text = "Got you" } } } }, // 默认兜底分支 Default = new WriteLine() { Text = "No matching condition found" } } } } }; // 运行工作流 WorkflowInvoker.Invoke(workflow);
方法二:用Flowchart工作流实现(直观顺序判断)
如果你觉得Switch的配置有点绕,Flowchart更贴合C# switch(true)的顺序判断逻辑,一目了然:
- 先创建一个Flowchart工作流,添加步骤:
- 第一步:用
AssignActivity读取用户输入到userInput变量。 - 第二步:添加
FlowDecision,判断string.IsNullOrEmpty(userInput),如果为true,走终止流程的分支;如果为false,进入下一个判断。 - 第三步:添加第一个
FlowDecision,判断userInput.Contains("hey"),true则走输出"Got hey"的FlowStep,然后结束流程;false则进入下一个FlowDecision。 - 第四步:第二个
FlowDecision判断userInput.Contains("what") && userInput.Contains("man"),true则输出对应内容,false进入下一个判断。 - 以此类推,最后加一个
FlowStep处理所有条件都不满足的情况。
- 第一步:用
这种方式的好处是完全和你写的C#代码逻辑一一对应,顺序判断,第一个满足条件的分支就会被执行,后续分支不会再触发。
关键注意点
- 分支顺序很重要:不管用哪种方法,WF都会按你定义的顺序检查条件,第一个满足的分支会被执行,所以要把优先级高的条件放在前面(比如如果某个输入同时包含"hey"和"you",只会执行第一个匹配的分支)。
- 表达式语法:确保在设计器里输入的表达式符合WF的语法,比如引用变量要正确,方法调用要符合.NET规则。
内容的提问来源于stack exchange,提问作者Saurabh Rai
相关产品推荐
相关产品推荐

