//获取model,T是外部传进来的模型脚本,该脚本必须继承自Model publicstatic T GetModel<T>() where T:Model { foreach(var m in Models.Values) { //m肯定是Model类型,但是这个m 是由 继承于Model的脚本上溯而来的,这里会进行下溯 看看m是否等于T if (m is T) { //若等于,则先强转为T脚本 再返回. return (T)m; } } returnnull; }
//获取view publicstatic T GetView<T>() where T : View { foreach (var v in Views.Values) { if (v is T) { return (T)v; } } returnnull; }
//发送事件(对于外部调用者来说该方法是发送事件,对于内部方法来说是不同的控制器和视图处理事件),命名上不要求和我一致,只要见名知意即可. publicstaticvoidSendEvent(string eventName,object data=null) { //在这里可发现一个事件对应一个Controller处理,具体事件继承于抽象事件,一个具体事件的诞生首先要进行继承于Controller 重写Execute 注册入CommandMap字典三步骤 //controller 执行,eventName是事件名称,若在控制器字典内存在该事件名称,则肯定会有一个控制器去处理该事件 if(ComandMap.ContainsKey(eventName)) { //t脚本类是继承于Controller类的,不然下面无法转换为Controller Type t = ComandMap[eventName]; //根据字典取出来的t,去实例化一个对象,并且object转化为Controller类型,因为t对象继承于Controller所以可以转化 Controller c = Activator.CreateInstance(t) as Controller; //执行被t所重写的Execute方法,data是传入的数据(object类型) c.Execute(data); } //view处理 //遍历所有视图,注意:一个视图允许有多个事件,而且一个事件可能会在不同的视图触发,而事件的内容不确定(事件可理解为触发消息) foreach(var v in Views.Values) { //视图v的关心事件列表中存在该事件 if(v.AttentionList.Contains(eventName)) { //让视图v执行该事件eventName,附带参数data //HandleEvent方法是通过switch case的形式处理不同的事件 v.HandleEvent(eventName, data); } } } }