我需要以编程方式定义一个可序列化的流程图 Windows 工作流,它接受输入参数并返回结果。我了解如何使用设计器创建这些工作流,但我需要在代码中完成并且让流程图工作流可序列化(因此没有 lambda 表达式)。
我无法获取分配的“收件人”字段。下面的代码创建了一个 WriteLine 后跟一个 Assign 的流程图工作流。
var ab = new ActivityBuilder<string> {
Name = "ActivityBuilt",
Implementation = new Flowchart {
StartNode = new FlowStep {
Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") },
Next = new FlowStep {
Action = new Assign {
DisplayName = "Set result",
To = new OutArgument<string>(new VisualBasicReference<string> {
ExpressionText = "results"}),
Value = new VisualBasicValue<string>("bye")
}
}
}
}
};
ab.Properties.Add(new DynamicActivityProperty {
Name = "greeting",
Type = typeof (InArgument<string>),
Value = "hello"});
ab.Properties.Add(new DynamicActivityProperty {
Name = "results",
Type = typeof (OutArgument<string>),
Value = "bye"});
// Convert the ActivityBuilder to a callable activity
using (var sw = new StringWriter()) {
using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext()))) {
XamlServices.Save(xw, LastCreated);
}
using (var sr = new StringReader(sw.ToString())) {
var wf = ActivityXamlServices.Load(sr);
return wf;
}
}
当我尝试从 ActivityBuilder 转换为 Activity 说“无法从文本'再见'创建'OutArgument'”时,上面的代码失败。如果我不使用 OutArgument 并且只是传递东西,这很好用。
我的问题是在 To 属性中放什么?如何引用我添加到 ActivityBuilder.Properties 的 OutArgument?VisualBasicReference 不是 OutArgument。我是否让这变得比需要的更困难?
感谢您的任何提示!
编辑:我想以编程方式创建工作流。工作流需要有输入参数和返回结果(输出参数)。
我了解如何创建工作流以及如何声明和使用输入参数。我正在使用 ActivityBuilder 创建工作流并通过 ActivityBuilder 的属性设置 InArgument。我通过序列化为 XAML,然后使用 ActivityXamlServices.Load 反序列化,从 ActivityBuilder 创建工作流。
我不明白的是如何从工作流程中获得结果。我认为它涉及 OutArgument。如何/在哪里将 OutArgument 添加到工作流程?我认为我提供的代码片段会为 OutArgument 分配一个值,但是对 ActivityXamlServices.Load 的调用失败,并抱怨它无法创建 OutArgument。
- 使用 ActivityBuilder 的方法是否正确?
- 分配操作的“收件人”字段是否正确引用了 OutArgument?
- 如何让 ActivityBuilder 知道 OutArgument 并且仍然能够转换为 Activity / 工作流?
希望这能澄清我的问题。