如何正确向Workflow工作流添加传递参数?附代码及报错示例
报错根因
你混淆了Windows Workflow Foundation(WF)中*变量(Variable)和输入参数(InArgument)*的作用边界:
- 你代码中定义的
Hehe是挂载在Sequence下的内部变量,作用域仅限Sequence内部子活动访问,不属于Sequence对外暴露的可接收输入的参数 WorkflowApplication构造函数接收的输入字典,仅支持给根活动公开的输入参数传值,无法直接给活动内部变量赋值,因此会抛出字典键无法映射到参数的错误。
修复方案
你可以根据场景选择以下两种实现方式:
方案1:保留内部变量,新增根活动输入参数做映射
如果Hehe变量需要在Sequence的多个子活动中复用,就给Sequence新增同名输入参数,将内部变量绑定到该参数上,输入字典直接给根参数传值即可:
private void Button_Click(object sender, RoutedEventArgs e) { // 定义根活动的对外输入参数 InArgument<string> inputUrl = new InArgument<string>("Hehe"); // 定义内部变量,绑定到输入参数取值 Variable<string> myVariable = new Variable<string>("Hehe", context => inputUrl.Get(context)); Dictionary<string, object> mainInputs = new Dictionary<string, object>(); mainInputs.Add("Hehe", "https://www.youtube.com"); OpenBrowser samsungPortalBrowser = new OpenBrowser(); samsungPortalBrowser.NewSession = true; samsungPortalBrowser.BrowserType = BrowserType.Chrome; samsungPortalBrowser.Url = myVariable; Sequence createSequence = new Sequence(); // 输入参数要加入Arguments集合,不是Variables集合 createSequence.Arguments.Add(inputUrl); createSequence.Activities.Add(samsungPortalBrowser); createSequence.Variables.Add(myVariable); WorkflowApplication app = new WorkflowApplication(createSequence, mainInputs); app.Run(); }
方案2:移除冗余中间变量,直接绑定活动属性到输入参数
如果URL值只需要给OpenBrowser活动使用,不需要跨活动复用,可以直接去掉中间变量,把OpenBrowser的Url属性直接绑定到根输入参数,代码更简洁:
private void Button_Click(object sender, RoutedEventArgs e) { InArgument<string> inputUrl = new InArgument<string>("Hehe"); Dictionary<string, object> mainInputs = new Dictionary<string, object>(); mainInputs.Add("Hehe", "https://www.youtube.com"); OpenBrowser samsungPortalBrowser = new OpenBrowser(); samsungPortalBrowser.NewSession = true; samsungPortalBrowser.BrowserType = BrowserType.Chrome; samsungPortalBrowser.Url = new InArgument<string>(context => inputUrl.Get(context)); Sequence createSequence = new Sequence(); createSequence.Arguments.Add(inputUrl); createSequence.Activities.Add(samsungPortalBrowser); WorkflowApplication app = new WorkflowApplication(createSequence, mainInputs); app.Run(); }
注意:WF的参数、变量名称大小写敏感,输入字典的键名必须和定义的InArgument名称完全一致,否则仍会出现映射错误。
内容的提问来源于stack exchange,提问作者Avrigeanu Laurian
相关产品推荐
相关产品推荐

