コード例 #1
0
        /// <summary>
        ///     Get all the event listeners for the given event type.
        /// </summary>
        /// <param name="services">Current service provider.</param>
        /// <param name="modules">Active modules for the current guild..</param>
        /// <returns>The event listeners.</returns>
        private static IEnumerable <EventHandler> GetHandlers <TEvent>(
            IServiceProvider services,
            IReadOnlyCollection <string> modules = null)
            where TEvent : IEvent
        {
            var checkEnabledModule = modules != null;

            foreach (var handler in services.GetServices <IEventListener>())
            {
                var events = RegisteredEventListener.FromType(handler.GetType());

                foreach (var eventHandler in events)
                {
                    if (eventHandler.EventType != typeof(TEvent) ||
                        checkEnabledModule &&
                        eventHandler.Module != null &&
                        !modules.Contains(eventHandler.Module))
                    {
                        continue;
                    }

                    yield return(new EventHandler(handler, eventHandler));
                }
            }
        }
コード例 #2
0
        public static IEnumerable <IRegisteredEventListener> FromMethod(Type listenerType, MethodInfo methodType)
        {
            // Get the return type.
            var returnType = methodType.ReturnType;

            if (returnType != typeof(void) && !returnType.IsTask())
            {
                throw new InvalidOperationException($"The method {methodType.GetFriendlyName()} does not return void or Task.");
            }

            // Register the event.
            var attribute = methodType.GetCustomAttribute <EventListenerAttribute>(false);

            Type[] eventTypes;

            if (attribute.Events.Length == 0)
            {
                if (methodType.GetParameters().Length == 0 || !typeof(IEvent).IsAssignableFrom(methodType.GetParameters()[0].ParameterType))
                {
                    throw new InvalidOperationException($"The first parameter of the method {methodType.GetFriendlyName()} should be the type {nameof(IEvent)}.");
                }

                eventTypes = new[] { methodType.GetParameters()[0].ParameterType };
            }
            else
            {
                eventTypes = attribute.Events;
            }

            // Get the module.
            var module = attribute.Module;

            foreach (var eventType in eventTypes)
            {
                var listener = new RegisteredEventListener(eventType, methodType, attribute, module, listenerType);

                yield return(listener);
            }
        }