给定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
值,但即使只有一个问题仍然适用。
答案 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;
作为第一个选择显然更具可扩展性和冗长性。