public void RemoveListener<TValue>(UTinyEventHandler<TEvent, TValue> @delegate)
                where TValue : class
            {
                IEvent @event;

                if (!m_Events.TryGetValue(typeof(TValue), out @event))
                {
                    return;
                }

                @event.RemoveListener(@delegate);
            }
            public void AddListener<TValue>(UTinyEventHandler<TEvent, TValue> @delegate) 
                where TValue : class
            {
                IEvent @event;

                if (!m_Events.TryGetValue(typeof(TValue), out @event))
                {
                    @event = new Event<TEvent, TValue>();
                    m_Events.Add(typeof(TValue), @event);
                }

                @event.AddListener(@delegate);
            }
 public static void RemoveListener<TEvent, TValue>(TEvent type, UTinyEventHandler<TEvent, TValue> @event)
     where TEvent : struct
     where TValue : class
 {
     UTinyEventDispatcher<TEvent>.RemoveListener(type, @event);
 }
 public void RemoveListener<TEventType, TObject>(UTinyEventHandler<TEventType, TObject> @delegate)
     where TEventType : struct
     where TObject : class
 {
     m_Delegate -= (UTinyEventHandler<TEvent, TValue>)(object)@delegate;
 }