繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM