我需要以编程方式定义一个可序列化的流程图Windows Workflow,它接受输入参数并返回结果。我理解如何使用设计器创建这些工作流程,但我需要在代码中执行它并使流程图工作流程可序列化(因此没有lambda表达式)。
我无法获取Assign的“To”字段。下面的代码创建了一个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“无法从文本'bye'创建'OutArgument'时,上述代码失败。”如果我不使用OutArgument并且只是传递内容,这可以正常工作。
我的问题是在To属性中放入什么?如何引用我添加到ActivityBuilder.Properties的OutArgument? VisualBasicReference不是OutArgument。我这让它变得比它需要的更难吗?
感谢任何提示!
编辑:我想以编程方式创建工作流程。工作流需要具有输入参数并返回结果(输出参数)。
我了解如何创建工作流以及如何声明和使用输入参数。我正在使用ActivityBuilder来创建工作流并通过ActivityBuilder的属性设置InArgument。我通过序列化到XAML从ActivityBuilder创建工作流,然后使用ActivityXamlServices.Load反序列化。
我不明白的是如何从工作流程中获得结果。我认为它涉及OutArgument。如何/在何处将OutArgument添加到工作流程?我认为我给出的代码片段会为OutArgument分配一个值,但对ActivityXamlServices.Load的调用失败,并且抱怨它无法创建OutArgument。
希望这能澄清我的问题。
答案 0 :(得分:4)
代码至少有3个问题:
请尝试以下代码:
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 InArgument<string>(new VisualBasicValue<string>("greeting"))
}
}
}
}
};
ab.Properties.Add(new DynamicActivityProperty
{
Name = "greeting",
Type = typeof(InArgument<string>),
Value = "hello"
});
ab.Properties.Add(new DynamicActivityProperty
{
Name = "results",
Type = typeof(OutArgument<string>)
});
// 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, ab);
}
using (var sr = new StringReader(sw.ToString()))
{
var wf = ActivityXamlServices.Load(sr);
WorkflowInvoker.Invoke(wf);
}
}