承接上一篇 ActivityAction/InvokeAction,本文介紹支援回傳值的委派活動對:ActivityFunc<TResult> 與 InvokeFunc<TResult>,適用於需在流程中動態注入「有回傳值的邏輯片段」場景。
ActivityFunc<TResult> (繼承 ActivityDelegate):
Handler (Activity):要執行的活動樹Argument、Argument1... (DelegateInArgument<T>):輸入參數Result (DelegateOutArgument<TResult>):回傳值InvokeFunc<TResult> (繼承 NativeActivity<TResult>):
Func (ActivityFunc):要呼叫的委派定義Argument、Argument1... (InArgument<T>):傳遞給委派的實際參數


流程設計:
myVariable (String)、myResult (String)myFunc (ActivityFunc<String, String>)InvokeFunc 繫結 Argument=myVariable、Result=myResult,但 Func 需在 XAML 中以 PropertyReference 指向 myFuncXAML 關鍵片段:
<InvokeFunc x:TypeArguments="x:String, x:String" Argument="[myVariable]" Result="[myResult]">
<PropertyReference x:TypeArguments="ActivityFunc(x:String, x:String)" PropertyName="myFunc" />
</InvokeFunc>
宿主程式碼注入實作:
// 自訂有回傳值的活動
public class MyActivity : CodeActivity<string>
{
public InArgument<string> InArgument { get; set; }
protected override string Execute(CodeActivityContext context)
{
return context.GetValue(InArgument) + ":wxd";
}
}
// 組裝委派並執行
var wf = new TestWorkflow();
var func = new ActivityFunc<string, string> {
Argument = new DelegateInArgument<string>(),
Handler = new MyActivity { InArgument = func.Argument }
};
wf.MyFunc = func;
WorkflowInvoker.Invoke(wf);
執行結果:
完整範例代碼:下載連結