2010-02-19 40 views
5

對於Windows Workflow [WF]來說是新的,並且有興趣爲業務目的評估WF。我決定通過introductionWF4RC,WriteLine活動在分配給TextWriter的StringWriter上拋出錯誤

[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:處理工作流樹遇到以下錯誤: '文字':文字只支持值類型和不可變類型System.String。 System.IO.TextWriter類型不能用作文字。

戳了一下,我發現this article描述了什麼似乎是我上面看到的錯誤。

作爲WF的新手,我並不真正瞭解改變或規定的方法來解決它。所以,我的問題是,

與WF4RC,如何[正確]使用WriteLine活動?

回答

8

確認,k,所以心理記錄:嘗試谷歌搜索的所有排列組合。搜索

WriteLine活動WF RC後發現this

的解決方法是把它包在一個LambdaValue<T>,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()); 
} 

這似乎怪我,但我從字面上相反的「專家」:P

我仍然歡迎替代品,如果任何人有他們。

+0

我有一個類似的問題,試圖設置一個字符串[]。 LambdaValue 工作。但我也注意到,如果你使用InArgument 它也可以工作,並且可能是它應該完成的方式。 – TrueEddie 2013-12-12 19:03:42

0

只是停留在它以及...在這裏我的愚見

的TextWriter就像活動的任何其他元素(例如文本元素)的InArgument。 InArgument是在工作流的上下文中計算的(因此使用ActivityContext來收集此工作流中的實際價值)。

當您直接分配作者時,它會自動轉換爲帶有文字表達式的InArgument。文字或多或少是工作流的不變部分,因此不允許更改。異常告訴你避免使用一個狀態會改變的類型。

使用LambdaValue表達式活動允許您在工作流的每個實例中分配一個(新)writer。工作流期望該對象具有臨時性質,直到工作流程結束。

我希望這個澄清這個問題,我沒有讓自己成爲一個孤獨者。