/// <summary> /// 在实例化的时候绑定事件订阅者 /// </summary> /// <param name="srcType"></param> internal void BindSubscribes(Type srcType) { // 事件源类型可能会被继承,但是扩展是基于事件源的,所以通过参数来传递类型(下面的代码不使用,也不要删除!) //Type srcType = this.GetType(); List <Type> types = ExtenderManager.GetSubscribers(srcType); if (types == null) { return; } // 这里假设:所有的订阅者类型注册都是在程序启动时执行的, // 反之,如果假设不成立,真是在运行过程中再注册订阅者,最终的执行结果也是不是预知的, // 所以,为了简化实现过程,也为了减少不必要的性能损耗,这里就不考虑线程同步问题的判断问题(假设集合不会在读取时修改)。 // 说明:这里不使用 foreach 循环,是因为:从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。 // 而使用 for ,对集合仅仅只是读取操作,List<T> 可以同时支持多个阅读器。 for (int i = 0; i < types.Count; i++) { Type t = types[i]; // 这里就不采用 ObjectFactory 来创建了,因为不太可能对扩展类型再扩展。 object subscriber = t.FastNew(); MethodInfo method = t.GetMethod("SubscribeEvent", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { srcType }, null); method.FastInvoke(subscriber, this); } }
/// <summary> /// 根据类型创建实例, /// 注意:将要实例化的类型必须有【无参的构造函数】。 /// </summary> /// <param name="objectType"></param> /// <returns></returns> public object CreateObject(Type objectType) { if (objectType == null) { throw new ArgumentNullException("objectType"); } object instance = null; // 封闭类型无法扩展,直接使用当前类型(不支持有参的构造函数) if (objectType.IsSealed) { instance = objectType.FastNew(); } else { // 尝试获取扩展类型 Type extType = ExtenderManager.GetExtendType(objectType); instance = (extType == null) ? objectType.FastNew() // 没有扩展类型,就直接使用原类型(不支持有参的构造函数) : extType.FastNew(); // 有扩展类型就创建扩展类型的实例 } // 尝试加载事件订阅者 BaseEventObject baseEventObject = instance as BaseEventObject; if (baseEventObject != null) { baseEventObject.BindSubscribes(objectType); } return(instance); }