2

我需要以编程方式定义可接受输入参数并返回结果的可序列化的流程图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转换到活动说上面的代码失败,“无法创建从文本‘再见’A‘OutArgument’。”这工作正常,如果我不使用OutArgument,只是通过东西。

我的问题是什么要放在属性?如何引用我添加到ActivityBuilder.Properties的OutArgument? VisualBasicReference不是一个OutArgument。我是否比这需要更困难?

感谢您的任何提示!

编辑:我想以编程方式创建工作流程。工作流程需要有输入参数并返回结果(输出参数)。

我明白如何创建工作流以及如何声明和使用输入参数。我正在使用ActivityBuilder创建工作流并通过ActivityBuilder的属性设置InArgument。我通过序列化到XAML,然后使用ActivityXamlServices.Load进行反序列化,从ActivityBuilder创建工作流程。

我不明白的是如何从工作流程中获得结果。我认为它涉及到一个OutArgument。我如何/在哪里向工作流添加OutArgument?我认为我给出的代码片段会为OutArgument分配一个值,但对ActivityXamlServices.Load的调用失败,并且抱怨无法创建OutArgument。

  • 使用ActivityBuilder的方法是否正确?
  • 正确引用OutArgument的Assign操作的“To”字段?
  • 如何使ActivityBuilder知道OutArgument并仍然能够转换为活动/工作流程?

希望能够澄清我的问题。

+0

我在这看我得到了更多的困惑越多。你想用这个工作流程做什么?请编辑以添加说明,例如“我正在尝试使用分配来设置OutArgument'foo'的值XYZ” – Will 2011-06-08 14:43:17

回答

4

有ATLEAST 3个问题的代码:

  1. 在分配的值需要被一个InArgument()。
  2. 您尝试读取的值名为“greeting”而不是“bye”。
  3. 名为“结果”的OutArgument不能有默认值。

试试下面的代码:

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); 
    } 
} 
+0

或者您可以只指定“新分配” – Oswald 2017-08-07 08:59:47