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

Workflow foundation 4 如何在代码中获取OutArgument的强类型值?,workflow-foundation-4,workflow-foundation-4.5,Workflow Foundation 4,Workflow Foundation 4.5,如果一个活动(通过设计器创建)具有多个OutArgument属性,那么在调用工作流后是否可以从属性获取其强类型值 代码如下所示: // generated class public partial class ActivityFoo : System.Activities.Activity.... { .... public System.Activities.OutArgument<decimal> Bar { ... } public System.Act

如果一个
活动
(通过设计器创建)具有多个
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(?)
//生成的类
公共部分类活动foo:System.Activities.Activity。。。。
{
....
public System.Activities.OutArgument Bar{…}
public System.Activities.OutArgument Baz{…}
}
//我的班级
var activity=new ActivityFoo();
var result=WorkflowInvoker.Invoke(活动);
十进制d=活动条获取(?)
字符串s=activity.Baz.Get(?)
OutArgument
上的
T Get()
方法需要一个
ActivityContext
,我不确定如何在代码中获取该方法

我还意识到可以从
result[“Bar”]
result[“Baz”]
中获取未键入的值并进行转换,但我希望还有另一种方法


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

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

碰巧活动允许一个人返回多个输出参数,例如C#方法不允许()

这就是为什么会有一个
WorkflowInvoker.Invoke()
重载,它返回一个
字典
,因为框架显然不知道您有多少类型的输出参数

总之,实现完全强类型化的唯一方法与普通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;
公共类活动FooOutput
{
公共十进制条{get;set}
公共十进制Baz{get;set;}
}
//生成类
公共部分类活动foo:System.Activities.Activity。。。。
{
public System.Activities.OutArgument结果{…}
}
//从现在开始,一切都是强类型的
var result=WorkflowInvoker.Invoke(活动);
十进制d=结果.Bar;
字符串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;
//已生成
public System.Activities.OutArgument结果{…}
//从现在开始,一切都是强类型的
var result=WorkflowInvoker.Invoke(活动);
十进制d=结果项1;
字符串s result.Item2;

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

我更新了问题,以明确存在多个out值。
Invoke
返回的是一个
IDictionary
,我正在尝试查看是否可以从活动的属性中获取值,而不是使用字符串访问字典。