private void RegHandlerType() { var registrar = ServicesCollection.BuildServiceProvider().GetService <IHandlerRegistrar>(); var registerExecutorMethod = registrar .GetType() .GetMethods(BindingFlags.Instance | BindingFlags.Public) .Where(mi => mi.Name == "RegisterHandler") .Where(mi => mi.IsGenericMethod) .Where(mi => mi.GetGenericArguments().Length == 1) .Single(mi => mi.GetParameters().Length == 1); var executorTypes = TypeDict.Values .Select(t => new { Type = t, Interfaces = t.GetInterfaces() .Where(i => i.GetTypeInfo().IsGenericType&& (i.GetGenericTypeDefinition() == typeof(ICommandHandler <>) || i.GetGenericTypeDefinition() == typeof(IEventHandler <>))) }) .Where(e => e.Interfaces != null && e.Interfaces.Any()); foreach (var executorType in executorTypes) { ServicesCollection.AddTransient(executorType.Type); foreach (var @interface in executorType.Interfaces) { var commandType = @interface.GetGenericArguments()[0]; registerExecutorMethod.MakeGenericMethod(commandType) .Invoke(registrar, new object[] { new Func <dynamic, Task>(x => { dynamic handler = ServicesCollection.BuildServiceProvider().GetService(executorType.Type); return(handler.Handle(x)); }) } ); } } }