public static void UnRegisterMsg(this IMsgReceiver self, string msgName, QVoidDelegate.WithParams callback, QMgrID channel = QMgrID.Global)
        {
            if (CheckStrNullOrEmpty(msgName) || CheckDelegateNull(callback))
            {
                return;
            }

            // 添加通道
            if (!mMsgHandlerDict.ContainsKey(channel))
            {
                Debug.LogError("Channel:" + channel.ToString() + " doesn't exist");
                return;
            }

            var handlers = mMsgHandlerDict [channel] [msgName];

            int handlerCount = handlers.Count;

            // 删除List需要从后向前遍历
            for (int index = handlerCount - 1; index >= 0; index--)
            {
                var handler = handlers [index];
                if (handler.receiver == self && handler.callback == callback)
                {
                    handlers.Remove(handler);
                    break;
                }
            }
        }
        /// <summary>
        /// 其实注销消息只需要Object和Go就足够了 不需要callback
        /// </summary>
        public static void UnRegisterMsgByChannel(this IMsgReceiver self, QMgrID channel, string msgName)
        {
            if (CheckStrNullOrEmpty(msgName))
            {
                return;
            }

            if (!mMsgHandlerDict.ContainsKey(channel))
            {
                Debug.LogError("Channel:" + channel.ToString() + " doesn't exist");
                return;
            }

            var handlers = mMsgHandlerDict[channel] [msgName];

            int handlerCount = handlers.Count;

            // 删除List需要从后向前遍历
            for (int index = handlerCount - 1; index >= 0; index--)
            {
                var handler = handlers [index];
                if (handler.receiver == self)
                {
                    handlers.Remove(handler);
                    break;
                }
            }
        }
        public static void SendMsgByChannel(this IMsgSender sender, QMgrID channel, string msgName, params object[] paramList)
        {
            if (CheckStrNullOrEmpty(msgName))
            {
                return;
            }

            if (!mMsgHandlerDict.ContainsKey(channel))
            {
                Debug.LogError("Channel:" + channel.ToString() + " doesn't exist");
                return;
            }

            // 略过,不用看
            if (!mMsgHandlerDict[channel].ContainsKey(msgName))
            {
                Debug.LogWarning("SendMsg is UnRegister");
                return;
            }

            // 开始看!!!!
            var handlers = mMsgHandlerDict[channel][msgName];

            var handlerCount = handlers.Count;

            // 之所以是从后向前遍历,是因为  从前向后遍历删除后索引值会不断变化
            // 参考文章,http://www.2cto.com/kf/201312/266723.html
            for (int index = handlerCount - 1; index >= 0; index--)
            {
                var handler = handlers[index];

                if (handler.receiver != null)
                {
                    Debug.Log("SendLogicMsg:" + msgName + " Succeed");
                    handler.callback(paramList);
                }
                else
                {
                    handlers.Remove(handler);
                }
            }
        }