有了这个工具类之后,我们就可以设计指导Builder进行产品类型创建的属性了。下面是一个示例的静态结构:
(Sequence为某个方法在BuildUp过程中的次序,Times表示执行次数, Handler代表需要通过反射机制实际执行的目标方法。)
定义用于指导BuildPart过程的属性:
C#借助这个属性,Builder可以获得执行某个BuildPart步骤地指导信息,包括该步骤地执行次序、需要执行的次数还有通过反射获得的方法信息。
/// 指导每个具体类型BuildPart过程目标方法和执行情况的属性
[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
public sealed class BuildStepAttribute : Attribute, IComparable
{
private int sequence;
private int times;
private MethodInfo handler;
public BuildStepAttribute(int sequence, int times)
{
this.sequence = sequence;
this.times = times;
}
public BuildStepAttribute(int sequence) : this(sequence, 1) { }
/// 该Attribute 需要执行的目标方法
public MethodInfo Handler
{
get { return handler; }
set { this.handler = value; }
}
/// 标注为这个Attribute的方法,在执行过程中的次序
public int Sequence { get { return this.sequence; } }
/// 标注为这个Attribute的方法,在执行过程中执行的次数
public int Times { get { return this.times; } }
/// 确保每个BuildStepAttribute可以根据sequence比较执行次序
public int CompareTo(object target)
{
if((target == null) || (target.GetType() != typeof(BuildStepAttribute)))
throw new ArgumentException("target");
return this.sequence - ((BuildStepAttribute)target).sequence;
}
}