不変タイプの可能System.Stringをサポートしています。 Workflow Foundation - Literal only supports value types and the immutable type System.String しかし、実際には、私は上記に与えられた解決策を(試してみました私が見つけることができる他の多くの試み)、それでも問題を解決できませんでした。WorkflowInvoker.Invokeはリテラルだけであるため、この類似の質問の、値の型と私の質問を繰り返すように解釈することができる
ワークフローコンソールアプリケーションでは、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に表示されます。
'リテラル< <> c__DisplayClass0>':リテラルは値型と不変のタイプの可能System.Stringをサポートしています。タイプWorkflowConsolePOC.Program + <> c__DisplayClass0は、リテラルとして使用することはできません。
ここでは何が欠けていますか?私は3日間このままで立ち往生しています。 私は親切にあなたの助けを求めます。ありがとう!
myCodeActivity.Entrada = new InArgument<DataTable>((ctx) => dtb);
それとも、このような引数を起動して渡すことができます: