C # не может делегировать обработчик событий с помощью метода возвращаемого типа Task - PullRequest
0 голосов
/ 05 мая 2018

Я работаю, чтобы иметь настраиваемую асинхронную обработку домена событий, когда Я попытался создать делегат для Task HandleEvent(TEvent @event) метода, который отвечает за асинхронное выполнение событий, если тип возвращаемого значения - Task, у меня есть исключение

System.ArgumentException: «Невозможно выполнить привязку к целевому методу, поскольку его подпись или прозрачность безопасности не совместимы с тип делегата. '

public IDisposable RegisterHandler(object handler)
        {
            Contract.Requires(handler != null);

            var interfaceType = handler.GetType().GetTypeInfo().GetInterfaces()
                .SingleOrDefault(t => t.GetGenericTypeDefinition() == typeof(IEventHandler<>));

            if (interfaceType == null)
            {
                throw new ArgumentException(string.Format("Supplied parameter does not implement {0} interface.", nameof(IEventHandler<object>)));
            }

            var eventType = interfaceType.GenericTypeArguments[0];

            var stream = this.eventStreams[eventType];
            var streamType = stream.GetType();

            if (this.eventStreams == null)
            {
                throw new KeyNotFoundException(string.Format("Event stream for '{0}' was not found.", eventType.Name));
            }

            var handleEvent = handler.GetType().GetTypeInfo().GetMethod(nameof(IEventHandler<object>.HandleEvent));
            var actionType = typeof(Action<>).MakeGenericType(eventType);

            var del = handleEvent.CreateDelegate(actionType, handler);

            var method = streamType.GetTypeInfo().GetMethods().First(
                t =>
                    t.Name == nameof(IEventStream<object>.Subscribe) &&
                    t.GetParameters().FirstOrDefault()?.ParameterType.GetGenericTypeDefinition() == typeof(Action<>));

            return (IDisposable)method.Invoke(stream, new object[] { del });
        }

Как я могу создать делегата для соответствующего метода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...