C# WF4RC,WriteLine活动在分配给TextWriter的StringWriter上引发错误
我是Windows工作流[WF]的新手,对出于业务目的评估WF感兴趣。我决定通过一个 遇到 测试方法SomeTests.SomeTests.TestMethod引发异常: System.Activities.InvalidWorkflowException:处理工作流树时遇到以下错误: “Literal”:Literal仅支持值类型和不可变类型System.String。类型System.IO.TextWriter不能用作文本 翻开眼睛,我发现上面描述的似乎是我看到的错误 作为WF的新成员,我并不真正理解改变或规定的解决方法。所以我的问题是,C# WF4RC,WriteLine活动在分配给TextWriter的StringWriter上引发错误,c#,.net,workflow-foundation-4,C#,.net,Workflow Foundation 4,我是Windows工作流[WF]的新手,对出于业务目的评估WF感兴趣。我决定通过一个 遇到 测试方法SomeTests.SomeTests.TestMethod引发异常: System.Activities.InvalidWorkflowException:处理工作流树时遇到以下错误: “Literal”:Literal仅支持值类型和不可变类型System.String。类型System.IO.TextWriter不能用作文本 翻开眼睛,我发现上面描述的似乎是我看到的错误 作为WF的新成员,我并
使用WF4RC,如何[正确]使用
WriteLine
活动?Ack,k,注意:尝试谷歌搜索的所有排列。搜索后发现
写入线活动WF RC
解决方案是将其包装在一个LambdaValue
,comme ca中
[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 ());
}
[TestMethod]
公共void测试方法()
{
StringWriter=新的StringWriter();
序列=新序列
{
活动=
{
新书写线
{
Text=“你好”,
TextWriter=新的LambdaValue(n=>writer)
},
新书写线
{
Text=“世界”,
TextWriter=新的LambdaValue(n=>writer)
}
}
};
WorkflowInvoker.Invoke(序列);
断言。
平等的(
“你好\r\nWorld\r\n”,
writer.GetStringBuilder().ToString();
}
这对我来说似乎很奇怪,但我实际上是“专家”的反面:p
如果有人有其他选择,我还是欢迎的。也只是停留在它上面。。。这是我的拙见 TextWriter与该活动的任何其他元素(如文本元素)一样,都是一个不活跃的参与者。InArgument是在工作流的上下文中计算的(因此使用ActivityContext来收集此工作流中的实际值) 当您直接指定writer时,它会自动转换为后面带有文字表达式的inagrament。文字或多或少是工作流中不变的部分,因此不允许更改。异常告诉您避免使用状态将更改的类型 使用LambdaValue expression活动可以在工作流的每个实例化中指定一个(新)编写器。工作流希望此对象在工作流结束之前具有临时性质
我希望这能澄清这个问题,我没有让自己成为一个孤僻的人。我在尝试设置字符串[]时也遇到过类似的问题。LambdaValue起作用了。但我也注意到,如果你使用InArgument,它也会起作用,而且可能是应该采用的方式。
[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 ());
}