public async Task <Result> Dispatch(IDomainEvent @event) { var validationResult = ParametersValidation.NotNull(@event, nameof(@event)); if (validationResult.IsFailure) { return(validationResult); } var eventType = @event.GetType(); var handlerType = typeof(IEventHandler <>).MakeGenericType(eventType); var handler = _serviceProvider.GetService(handlerType); if (handler == null) { return(Result.Ok()); } var method = handler.GetType() .GetRuntimeMethods() .First(x => x.Name.Equals("HandleAsync") && x.GetParameters().First().ParameterType == eventType); return(await(Task <Result>) method.Invoke(handler, new object[] { @event })); }