0

给定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我不确定如何在代码中获得的方法。

我也意识到可以从 and 中获取未类型化的值result["Bar"]result["Baz"]对其进行转换,但我希望有另一种方法。

更新以明确存在多个Out值,尽管即使只有一个问题仍然适用。

4

1 回答 1

0

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

碰巧的是,活动允许返回多个输出参数,例如 C# 方法不允许的(实际上这将随着 C# 7 和元组而改变)。

这就是为什么你有一个WorkflowInvoker.Invoke()返回 a 的重载,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;

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

于 2017-01-19T23:24:32.137 回答