![](/img/trans.png)
[英]How to get OutArgument from a scheduled activity inside a native activity?
[英]How do I get the strongly-typed value of an OutArgument in code?
给定一个具有多个OutArgument
属性的Activity
(通过设计器创建),是否可以在调用工作流之后从一个属性中获取其强类型值?
代码如下:
// 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(?)
OutArgument<T>
上的T Get()
方法需要一个ActivityContext
,我不确定该如何从代码中获取。
我也意识到可以从result["Bar"]
和result["Baz"]
获取未类型化的值并将其result["Baz"]
,但是我希望有另一种方法。
已更新,以明确存在多个Out
值,尽管即使只有一个,该问题仍然适用。
如果将工作流视为代码,那么“活动”只不过是一种接收输入参数并(可能)返回输出参数的方法。
碰巧,Activity允许一个人返回多个输出参数,例如C#方法不这样做( 实际上这将随着C#7和元组而改变 )。
这就是为什么您有一个WorkflowInvoker.Invoke()
重载,该重载返回Dictionary<string, object>
原因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;
作为第一个选择,显然更具可扩展性和冗长性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.