Я использую Activator.CreateInstance в качестве основной части моей инфраструктуры, главным образом для реализации реализаций моих поставщиков доступа к данным (которые определяются интерфейсом).
Поскольку я знаю, какой из них мне нужен, я просто передаю ключ AppSetting, чтобы вы могли изменить, какие из них вы используете, через config.
Я согласен с Кейном - я не уверен на 100%, что у вас за вопрос.
Если вы передаете перечисление, разве это не говорит о том, что вы знаете, какой тип вы хотите создать (даже если только в общем смысле, а не в явном)?
В какой-то момент что-то должно будет принять решение относительно того, что происходит - вы знаете, кто / что это такое? Возможные варианты:
- Через конфигурацию: хорошо, когда вам нужен контроль, но на самом деле не слишком часто меняйте настройки. Также подходит для общих понятий (клиенты = настройка A; продукты = настройка B и т. Д.).
- Сохранение целевого типа в базе данных со связанными данными - позволит вам связать конкретную реализацию (передаваемую в активатор) с любым экземпляром класса. Это обеспечивает более высокую степень контроля - но как этот тип определяется и сохраняется в первую очередь?
- Вместо того, чтобы использовать ToString () (которую вы могли бы перегрузить / заменить), используйте OO для добавления нового члена в каждый рассматриваемый класс (возможно, простой интерфейс), где новый член возвращает информацию, необходимую для активатора.
Может быть, вы просто просите слишком много самого перечисления? Вы все еще должны иметь возможность использовать enum для управления выполнением, но вам нужно отделить способ создания экземпляров.
Это достаточно ясно, или людям нужны / нужны примеры кода?