【问题标题】:WorkflowInvoker.Invoke - Literal only supports value types and the immutable type System.StringWorkflowInvoker.Invoke - Literal 仅支持值类型和不可变类型 System.String
【发布时间】:2017-02-08 01:06:16
【问题描述】:

由于这个类似的问题,我的问题可能会被解释为重复: Workflow Foundation - Literal only supports value types and the immutable type System.String 但事实上,我已经尝试了上述给出的解决方案(以及我能找到的许多其他尝试),但仍然无法解决问题。

在工作流控制台应用程序中,我想将一个 DataTable 发送到我自己的 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。

'Literalc__DisplayClass0>':Literal 仅支持值类型和不可变类型 System.String。类型 WorkflowConsolePOC.Program+c__DisplayClass0 不能用作文字。

我在这里缺少什么?我被困在这三天。 我恳请您的帮助。谢谢!

【问题讨论】:

    标签: c# workflow-foundation workflow-activity


    【解决方案1】:

    这是设置引用类型的正确方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多