簡體   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