WF4RC,WriteLine活动在分配给TextWriter的StringWriter上抛出错误

我是Windows Workflow [WF]的新手,并且有兴趣为业务目的评估WF。 我决定通过介绍

[TestMethod] public void TestMethod () { TextWriter writer = new StringWriter (); Sequence sequence = new Sequence { Activities = { // so, assigning a reference type [eg StringWriter] // as target is prohibited in WF4RC. what or how do // i assign a target? introduction cited above may // not be current [ie may be Beta2, not RC] so ... ? new WriteLine { Text = "Hello", TextWriter = writer }, new WriteLine { Text = "World", TextWriter = writer } } }; // !!! BLOWS UP !!! WorkflowInvoker.Invoke (sequence); } 

并遇到了

测试方法SomeTests.SomeTests.TestMethod引发exception:System.Activities.InvalidWorkflowException:处理工作流树时遇到以下错误:’Literal’:Literal仅支持值类型和不可变类型System.String。 System.IO.TextWriter类型不能用作文字。

四处寻找,我发现这篇文章描述了我上面看到的错误。

作为WF的新手,我真的不明白改变或规定的方法来解决它。 所以,我的问题是,

使用WF4RC,如何[正确]使用WriteLine活动?

Ack,k,所以请注意:尝试Google搜索的所有排列。 找到后找到了这个

WriteLine活动WF RC

解决方案是将它包装在一个LambdaValue

 [TestMethod] public void TestMethod () { StringWriter writer = new StringWriter (); Sequence sequence = new Sequence { Activities = { new WriteLine { Text = "Hello", TextWriter = new LambdaValue (n => writer) }, new WriteLine { Text = "World", TextWriter = new LambdaValue (n => writer) } } }; WorkflowInvoker.Invoke (sequence); Assert. AreEqual ( "Hello\r\nWorld\r\n", writer.GetStringBuilder ().ToString ()); } 

这对我来说似乎很奇怪,但我确实与“专家”相反:P

如果有人拥有它们,我仍然会欢迎替代品。

只是坚持下去……这是我的拙见

TextWriter与活动的任何其他元素(例如Text元素)一样是InArgument。 InArgument是在工作流的上下文中计算的(因此使用ActivityContext来收集此工作流中的实际值)。

在直接分配编写器时,它会自动转换为InArgument,后面带有Literal表达式。 文字或多或少是工作流程中不变的部分,因此不允许更改。 该exception告诉您避免使用状态会改变的类型。

使用LambdaValue表达式活动允许您在工作流的每个实例中分配(新)编写器。 工作流程期望此对象具有临时性,直到工作流程结束。

我希望这可以澄清这个问题,但我并没有让自己成为一个蠢货。