如何在代码中获取OutArgument的强类型值?

时间:2017-01-19 01:50:51

标签: workflow-foundation-4 workflow-foundation-4.5

给定Activity(通过设计器创建)具有多个OutArgument属性,是否可以在调用工作流后从属性中获取强类型值?

代码如下所示:

// generated class
public partial class ActivityFoo : System.Activities.Activity....
{
    ....
    public System.Activities.OutArgument<decimal> Bar { ... }
    public System.Activities.OutArgument<string> Baz { ... }
}

// my class
var activity = new ActivityFoo();
var result = WorkflowInvoker.Invoke(activity);

decimal d = activity.Bar.Get(?)
string s = activity.Baz.Get(?)

T Get()上的OutArgument<T>方法,需要ActivityContext我不确定如何在代码中获取。

我也意识到可以从result["Bar"]result["Baz"]获取未键入的值并投射它们,但我希望还有另一种方法。

已更新,以明确有多个Out值,但即使只有一个问题仍然适用。

1 个答案:

答案 0 :(得分:0)

如果将工作流视为代码,则Activity只不过是一个接收输入参数并且(可能)返回输出参数的方法。

有些活动允许一个人返回多个输出参数,例如,C#方法没有(actually that's about to change with C# 7 and tuples)。

这就是为什么你有WorkflowInvoker.Invoke()重载返回Dictionary<string, object>的原因,因为框架显然不知道你有多少\什么类型的输出参数。

最重要的是,完全强类型的唯一方法与使用普通C#方法完全相同 - 返回一个自定义类型的OutArgument

public class ActivityFooOutput
{
    public decimal Bar { get; set }
    public decimal Baz { get; set; }
}

// generated class

public partial class ActivityFoo : System.Activities.Activity....
{
    public System.Activities.OutArgument<ActivityFooOutput> Result { ... }
}

// everything's strongly-typed from here on

var result = WorkflowInvoker.Invoke<ActivityFooOutput>(activity);

decimal d = result.Bar;
string s result.Baz;

实际上,如果您不想为它创建自定义类型,则可以使用所述元组:

// generated

public System.Activities.OutArgument<Tuple<decimal, string>> Result { ... }

// everything's strongly-typed from here on

var result = WorkflowInvoker.Invoke<Tuple<decimal, string>>(activity);

decimal d = result.Item1;
string s result.Item2;

作为第一个选择显然更具可扩展性和冗长性。