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

时间:2010-02-19 19:14:18

标签: c# .net workflow-foundation-4

是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活动?

2 个答案:

答案 0 :(得分:8)

Ack,k,所以请注意:尝试Google搜索的所有排列。搜索

后找到this
  

WriteLine活动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表达式活动允许您在工作流的每个实例中分配(新)编写器。在工作流结束之前,工作流期望此对象具有临时性。

我希望这可以澄清这个问题,但我并没有让自己陷入困境。