2017-02-08 6 views
1

내 질문은 이와 비슷한 질문 때문에 반복되는 것으로 해석 될 수 있습니다. Workflow Foundation - Literal only supports value types and the immutable type System.String 사실, 위의 솔루션을 시도했습니다. 그리고 내가 찾을 수있는 많은 다른 시도들) 여전히 문제를 해결할 수 없었다.WorkflowInvoker.Invoke - 리터럴은 값 유형과 변경 불가능한 타입 만 지원합니다.

워크 플로 콘솔 응용 프로그램에서 DataTable을 내 자신의 CodeActivity로 보내고 Main으로 되돌리고 싶습니다.

namespace WorkflowConsolePOC 
{ 

    public sealed class MyCodeActivity : CodeActivity<DataTable> 
    { 
     public InArgument<string> Message { get; set; } 
     public InArgument<System.Data.DataTable> Entrada { get; set; } 

     // If your activity returns a value, derive from CodeActivity<TResult> 
     // and return the value from the Execute method. 
     protected override DataTable Execute(CodeActivityContext context) 
     { 
      // Obtain the runtime value of the input arguments 
      string codeString = context.GetValue(this.Message); 
      //Get the DataTable 
      DataTable entrada = context.GetValue<DataTable>(Entrada); 

      //Alter the first row, first column 
      entrada.Rows[0][0] = "Altered"; 

      return entrada; 
     } 
    } 
} 

가 내 사용자 정의 활동도

에 충돌되지 않습니다

namespace WorkflowConsolePOC 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Build some DataTable 
      DataTable dtb = new DataTable(); 
      dtb.Clear(); 
      dtb.Columns.Add("name"); 
      dtb.Columns.Add("age"); 
      DataRow row = dtb.NewRow(); 
      row["name"] = "Thiago"; 
      row["age"] = "33"; 
      dtb.Rows.Add(row); 

      string msg = ("Some message" + Environment.NewLine + " Test purpose"); 

      MyCodeActivity myCodeActivity = new MyCodeActivity(); 
      myCodeActivity.Message = new InArgument<string>(msg); 
      //Passing the DataTable 
      //This is the solution given to the existing question: 
      myCodeActivity.Entrada = new InArgument<DataTable>(ExpressionServices.Convert((env) => dtb)); 

      //This was my attempt which results in the same exception, but with 'Literal<DataTable>':... 
      //myCodeActivity.Entrada = new InArgument<DataTable>(dtb); 

      dtb = WorkflowInvoker.Invoke<DataTable>(myCodeActivity); // <==== Error 

      //Read the first row of the resulting DataTable 
      Console.WriteLine(dtb.Rows[0][0].ToString()); 
     } 
    } 
} 

는 그리고 이것은 MyCodeActivity 코드입니다. WorkflowInvoker.Invoke에 오류가 나타납니다.

'리터럴 < <> c__DisplayClass0>'리터럴 값 만 유형 및 불변 선택 System.String 타입을 지원한다. 형식 WorkflowConsolePOC.Program + <> c__DisplayClass0은 리터럴로 사용할 수 없습니다.

무엇이 여기에 있습니까? 나는 이것을 3 일 동안 붙들고있다. 친절하게 도움을 요청합니다. 감사!

답변

0

이 참조 유형 설정하는 올바른 방법입니다 :

myCodeActivity.Entrada = new InArgument<DataTable>((ctx) => dtb); 

아니면 호출이 같은 인수를 전달할 수 있습니다

MyCodeActivity myCodeActivity = new MyCodeActivity(); 

var arguments = new Dictionary<String, Object> 
{ 
    { "Message", msg }, 
    { "Entrada", dtb }, 
}; 

dtb = WorkflowInvoker.Invoke<DataTable>(myCodeActivity, arguments);