public void RemoveHandler(Type messageType, Type handlerType)
        {
            var baseHandlerTypes = MessageHandlerExtensions.GetBaseHandlerTypes(handlerType);

            foreach (var baseHandlerType in baseHandlerTypes)
            {
                var messageType1 = baseHandlerType.GenericTypeArguments.Single();
                if (messageType != messageType1)
                {
                    continue;
                }
                if (!_handlerDict.TryGetValue(messageType, out var handlers))
                {
                    continue;
                }
                if (handlers.All(handlerWrapper => handlerWrapper.BaseHandlerType != baseHandlerType))
                {
                    continue;
                }
                handlers = handlers.Where(x => x.BaseHandlerType != baseHandlerType).ToList();
                if (handlers.Count != 0)
                {
                    continue;
                }
                _handlerDict.Remove(messageType);
                var eventName = MessageNameAttribute.GetNameOrDefault(messageType);
                if (_messageTypeMappingDict.ContainsKey(eventName))
                {
                    _messageTypeMappingDict.Remove(eventName);
                }
                OnEventRemoved?.Invoke(this, messageType);
            }
        }
        public void AddHandler(Type messageType, Type handlerType)
        {
            var baseHandlerTypes = MessageHandlerExtensions.GetBaseHandlerTypes(handlerType);

            foreach (var baseHandlerType in baseHandlerTypes)
            {
                var messageType1 = baseHandlerType.GenericTypeArguments.Single();
                if (messageType != messageType1)
                {
                    continue;
                }
                RegisterMessageHandlerWrapper(messageType, handlerType, baseHandlerType);
                RegisterMessageTypeMapping(messageType);
            }
        }