与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);
}
}
}