Скажем, вы хотите построить стол. Вы уже знаете размеры заранее, какой материал использовать, сколько это будет стоить и так далее, поэтому вы просто создаете таблицу.
var table = new Table();
Допустим, теперь вы хотите расширить это и построить для них таблицы других людей, поэтому вы поставили флажок, в котором люди могли бы составлять планы для своих пользовательских таблиц. Коробка есть с самого начала, но вы не представляете, какие планы будут проходить через эту коробку, и их может быть произвольное количество, так что вам придется работать над ними на лету.
foreach(Type plan in planBox)
Activator.CreateInstance(plan);
Разница в том, что тип - это часть метаданных, которые у вас есть во время выполнения о данном объекте (так сказать, планах). Если бы вы знали тип во время компиляции, вы бы поместили его непосредственно в свой код, но вы не представляете, что произойдет через ваш блок Core.EntityList.Entities
, и поэтому вы должны использовать отражение, чтобы использовать эту информацию времени выполнения соответствующим образом.
Дело в том, что если вы используете информацию времени выполнения, вы должны использовать возможности времени выполнения. Если все типы известны во время компиляции, не используйте объекты Type.