簡體   English   中英

WorkflowInvoker.Invoke-文字僅支持值類型和不可變類型System.String

[英]WorkflowInvoker.Invoke - Literal only supports value types and the immutable type System.String

由於存在類似的問題,我的問題可能被解釋為重復的: Workflow Foundation-文字僅支持值類型和不可變類型System.String,但實際上,我已經嘗試了上述解決方案(以及許多其他嘗試,找到),仍然無法解決問題。

在工作流控制台應用程序中,我想將數據表發送到我自己的CodeActivity中,然后將其返回給Main。

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的代碼:

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;
        }
    }
}

我的自定義活動甚至沒有被執行。 該錯誤出現在WorkflowInvoker.Invoke。

'Literal <<> c__DisplayClass0>':Literal僅支持值類型和不可變類型System.String。 類型WorkflowConsolePOC.Program + <> c__DisplayClass0不能用作文字。

我在這里想念什么? 我在這停留了三天。 請您幫忙。 謝謝!

這是設置引用類型的正確方法:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM