They had a Type object—a blueprint—but no way to write the new keyword because the code hadn't been written yet.
In the .NET 4.6.1 ecosystem—which was heavily used for ASP.NET MVC 5, Web API 2, and WPF— Activator was the silent engine behind the magic. activators dotnet 4.6.1
// 2. With arguments object obj2 = Activator.CreateInstance(typeof(Demo), "Test", 42); ((Demo)obj2).Show(); They had a Type object—a blueprint—but no way
Early DI frameworks or custom containers used Activator.CreateInstance to resolve services dynamically. Web API 2