是Windows Workflow [WF]的新手,并且有兴趣为业务目的评估WF。我决定通过introduction
[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抛出异常: System.Activities.InvalidWorkflowException:处理工作流树时遇到以下错误: 'Literal':Literal只支持值类型和不可变类型System.String。 System.IO.TextWriter类型不能用作文字。
四处寻找,我发现this article描述了我上面看到的错误。
作为WF的新手,我真的不明白改变或规定的方法来解决它。所以,我的问题是,
使用WF4RC,如何[正确]使用WriteLine
活动?
答案 0 :(得分:8)
Ack,k,所以请注意:尝试Google搜索的所有排列。搜索
后找到thisWriteLine活动WF RC
解决方案是将其包裹在LambdaValue<T>
,纪念卡
[TestMethod]
public void TestMethod ()
{
StringWriter writer = new StringWriter ();
Sequence sequence = new Sequence
{
Activities =
{
new WriteLine
{
Text = "Hello",
TextWriter = new LambdaValue<TextWriter> (n => writer)
},
new WriteLine
{
Text = "World",
TextWriter = new LambdaValue<TextWriter> (n => writer)
}
}
};
WorkflowInvoker.Invoke (sequence);
Assert.
AreEqual (
"Hello\r\nWorld\r\n",
writer.GetStringBuilder ().ToString ());
}
这对我来说似乎很奇怪,但我确实与“专家”相反:P
如果有人拥有替代品,我仍会欢迎。
答案 1 :(得分:0)
只是坚持下去......在这里我的拙见
TextWriter与活动的任何其他元素(例如Text元素)一样是InArgument。 InArgument是在工作流的上下文中计算的(因此使用ActivityContext来收集此工作流中的实际值)。
当您直接分配编写器时,它会自动转换为InArgument,后面带有Literal表达式。文字或多或少是工作流的不变部分,因此不允许更改。该异常告诉您避免使用状态会改变的类型。
使用LambdaValue表达式活动允许您在工作流的每个实例中分配(新)编写器。在工作流结束之前,工作流期望此对象具有临时性。
我希望这可以澄清这个问题,但我并没有让自己陷入困境。