一个问题的设计问题,关于反射和委托。
有这样一个要求,定时执行某些事件。
比如,有100个事件需要定时执行:
事件1:每周1执行
事件2:每月1号执行
事件3:每天执行
事件4....
这个架构该怎么弄呢?
目前我是这样的:
=========================================================
//一个委托
public delegate void timeChangeHander(DateTime dt);
//=========================================================
//这个是定时执行的类
public class PlanDo
{
private DateTime dt{set;get;}
public PlanDo(DateTime dt)
{
this.dt=dt;
}
public event timeChangeHander timeChangeEvent;
protected virtual void PlanTaskExecute()
{
if (timeChangeEvent != null)
{
timeChangeEvent(DateTime.Now);
}
public void DoTask()
{
PlanTaskExecute();
}
}
//=================================================
//定义一个执行任务的接口
public interface IBaseInter
{
void doTask(DateTime dt);
}
//定义一个某些相似的任务的抽象类
public abstract class absSomeType:IBaseInter
{
public virtual bool isSuitDate(DateTime dt)
{
return false;
}
public virtual void doTask(DateTime dt)
{
if(isSuitDate(dt))
{
Console.WriteLine(“基类执行”);
}
}
}
//接下来就是各个具体的执行类了。。。
//这个每月1号执行
public class ExecuteSomeType1 : absSomeType
{
public override bool isSuitDate(DateTime dt)
{
if (dt.Day== 1)
{
return true;
}
return false;
}
public override void doTask(DateTime dt)
{
base.doTask(dt);
Console.WriteLine(“子类1执行”);
}
}
//这个每周1执行
public class ExecuteSomeType2 : absSomeType
{
public override bool isSuitDate(DateTime dt)
{
if (dt.DayOfWeek == DayOfWeek.Monday)
{
return true;
}
return false;
}
public override void doTask(DateTime dt)
{
base.doTask(dt);
Console.WriteLine(“子类2执行”);
}
}
//下面还有很多个这样的子类。。。。
//====================================================
//然后在Main函数中,我会的,是这样写的:
PlanDo observer = new PlanDo(DateTime.Now);
IList<IBaseInter> listType = new List<IBaseInter>();
//以下添加需要计划任务执行的任务
listType.Add(new ExecuteSomeType1());
listType.Add(new ExecuteSomeType2());
listType.Add(new ExecuteSomeType3());
listType.Add(new ExecuteSomeType4());
listType.Add(new ExecuteSomeType5());
listType.Add(new ExecuteSomeType6());
listType.Add(new ExecuteSomeType7());
//。。。。还要加上很多个这样的语句,太多了,想精简一下。。。
foreach (IBaseInter t in listType)
{
observer.timeChangeEvent += new PlanTask.timeChangeHander(t.doTask);
}
observer.DoTask();
//====================================================================
//这是我目前的做法,但是吧,在主函数中,加入各个具体任务的子类部分的语句太多了,而且每次添加一个任务,都要改这
//儿的代码,所以我想用反射来做:
System.Reflection.Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
Type[] ts = ass.GetModules()[0].GetTypes();
foreach (Type t in ts)
{
object inters = t.GetInterface("IBaseInter",false);
if (inters!=null)
{
if (t.BaseType != typeof(object))
{
IBaseInter all = t as IBaseInter;//这儿总是得到空值,有错误。。。
if (all != null)
{
ober.timeChangeEvent += all.doTask;
}
}
}
}
ober.DoTask();