public void RemoveSubscription(Type eventType, Type handlerType)
        {
            var eventName       = EventNameAttribute.GetNameOrDefault(eventType);
            var handlerToRemove = TryFindSubscriptionToRemove(eventName, handlerType);

            TryRemoveHandler(eventName, handlerToRemove);
        }
        private void TryAddSubscriptionEventHandler(Type eventType, Type handlerType)
        {
            var eventName = EventNameAttribute.GetNameOrDefault(eventType);

            if (!IncludeSubscriptionsHandlesForEventName(eventName))
            {
                _handlers.GetOrAdd(eventName, new List <Type>());
            }
            if (_handlers[eventName].Any(s => s == handlerType))
            {
                throw new ArgumentException(
                          $"Handler Type {handlerType.Name} already registered for '{eventName}'", nameof(handlerType));
            }
            _handlers[eventName].Add(handlerType);
        }
        private void TryAddSubscriptionEventType(Type eventType)
        {
            var eventName = EventNameAttribute.GetNameOrDefault(eventType);

            if (_eventTypes.ContainsKey(eventName))
            {
                //duplicate event key
                if (_eventTypes[eventName] != eventType)
                {
                    throw new ArgumentException(
                              $"Event name {eventName} already exists,please make sure the event key is unique");
                }
            }
            else
            {
                _eventTypes[eventName] = eventType;
            }
        }