代码之家  ›  专栏  ›  技术社区  ›  johnny g

WF4RC,WriteLine活动在分配给TextWriter的StringWriter上引发错误

  •  5
  • johnny g  · 技术社区  · 14 年前

    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的新成员,我并不真正理解改变或规定的解决方法。所以我的问题是,,

    WriteLine 活动?

    2 回复  |  直到 12 年前
        1
  •  8
  •   johnny g    14 年前

    this 搜寻

    写入线活动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

    如果有其他选择,我仍然欢迎。

        2
  •  0
  •   Thomas    13 年前

    只是也被它卡住了。。。这是我的拙见

    TextWriter与该活动的任何其他元素(如文本元素)一样,都是一个不活跃的参与者。InArgument是在工作流的上下文中计算的(因此使用ActivityContext来收集此工作流中的实际值)。

    当您直接指定writer时,它会自动转换为后面带有文字表达式的inagrament。文字或多或少是工作流中不变的部分,因此不允许更改。异常告诉您避免使用状态将更改的类型。

    使用LambdaValue expression活动可以在工作流的每个实例化中指定一个(新)编写器。工作流希望此对象在工作流结束之前具有临时性质。

    我希望这能澄清这个问题,我并没有让自己成为一个忧郁的人。