2017-01-19 14 views
0

鑑於Activity(通過設計人員創建)具有幾個OutArgument屬性,是否可以在調用工作流之後從屬性獲取其強類型值?如何在代碼中獲取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這我不知道如何獲取代碼。

我也意識到可以從result["Bar"]result["Baz"]獲得非鍵入的值並投射它們,但我希望有另一種方法。

已更新,以清除有多個Out值,但即使只有一個,問題仍然適用。

回答

0

如果您將工作流視爲代碼,則Activity不過是一種接收輸入參數和(可能)返回輸出參數的方法。

活動允許一個返回多個輸出參數,例如C#方法不支持(actually that's about to change with C# 7 and tuples)。

這就是爲什麼你有一個WorkflowInvoker.Invoke()重載,它返回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; 

作爲第一個選項顯然更具可擴展性和冗長。

+0

我已經更新了這個問題,以清楚地表明有多個輸出值。從'Invoke'返回的是一個'IDictionary ',我試圖看看是否可以從活動的屬性中獲取值,而不是使用字符串來訪問字典。 – Jedidja

相關問題