与CLR/BCL/C#里的概念进行联想对比,不难理解。
using System; using System.Activities; using System.Activities.Expressions; using System.Activities.Statements; namespace ActivityDelegateAndInvoke { public sealed class GetAndPlay<T> : Activity { public ActivityFunc<T> Get { get; set; } public ActivityAction<T> Play { get; set; } public GetAndPlay() { this.Implementation = () => { Variable<T> data = new Variable<T>(); var seq = new Sequence { Variables = { data }, Activities = { new InvokeFunc<T> { Func = Get, Result = data }, new InvokeAction<T> { Action = Play, Argument = data } } }; return seq; }; } protected override void CacheMetadata(ActivityMetadata metadata) { base.CacheMetadata(metadata); if (Get == null) metadata.AddValidationError("Get is null"); if (Play == null) metadata.AddValidationError("Play is null"); } } public sealed class GetDateTime : CodeActivity<string> { protected override string Execute(CodeActivityContext context) { return DateTime.Now.ToString(); } } public sealed class Show : CodeActivity { [RequiredArgument] public InArgument<string> Text { get; set; } protected override void Execute(CodeActivityContext context) { Console.WriteLine(this.Text.Get(context)); } } public static class Test { public static void Run() { var dateOut = new DelegateOutArgument<string>(); var getDateTime = new ActivityFunc<string> { Result = dateOut, Handler = new GetDateTime { Result = dateOut } }; var dateIn = new DelegateInArgument<string>(); var show = new ActivityAction<string> { Argument = dateIn, Handler = new Show { Text = dateIn } }; var showDatetime = new GetAndPlay<string> { Get = getDateTime, Play = show }; WorkflowInvoker.Invoke(showDatetime); } } }