using Microsoft.Extensions.DependencyInjection;
private static readonly Startup Startup = new Startup();
public static void Main()
var serviceNameArgument = "junk";
var serviceType = Assembly.GetExecutingAssembly().GetType(serviceNameArgument, false, true);
dynamic greeter = Startup.Build().GetService(serviceType);
Console.WriteLine(greeter.SayHello().Message);
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException)
Console.WriteLine("Unsupported type");
private readonly IServiceCollection services;
services = new ServiceCollection();
Assembly.GetExecutingAssembly()
.Where(t => !t.IsAbstract && t.IsAssignableToGenericType(typeof(IGreet<>)))
.ForEach(t => services.AddTransient(t));
services.AddTransient<Junk>();
public ServiceProvider Build() => services.BuildServiceProvider();
public interface IGreet<T>
public class Apple : IGreet<AppleResult>
public AppleResult SayHello()
return new AppleResult { Message = "Hello apple" };
public string Message { get; set; }
public class Orange : IGreet<OrangeResult>
public OrangeResult SayHello()
return new OrangeResult { Message = "Hello orange" };
public class OrangeResult
public string Message { get; set; }
public static class ReflectionExtensions
public static bool IsAssignableToGenericType(this Type givenType, Type genericType)
var interfaceTypes = givenType.GetInterfaces();
foreach (var it in interfaceTypes)
if (it.IsGenericType && it.GetGenericTypeDefinition() == genericType)
if (givenType.IsGenericType && givenType.GetGenericTypeDefinition() == genericType)
var baseType = givenType.BaseType;
if (baseType == null) return false;
return IsAssignableToGenericType(baseType, genericType);