У меня есть класс в моем приложении Prism / CAL, который генерирует форму для пользователей для ввода данных.
Форма определяется файлом XML следующим образом:
<area idCode="general" title="General">
<column>
<group title="Customer Data">
<field idCode="title" requiredStatus="true">
<label>title</label>
<fieldType>Title</fieldType>
</field>
<field idCode="firstName" requiredStatus="true">
<label>First Name</label>
<fieldType>Text</fieldType>
</field>
<field idCode="lastName" requiredStatus="true">
<label>Last Name</label>
<fieldType>Text</fieldType>
</field>
<field idCode="email" requiredStatus="true">
<label>E-Mail</label>
<fieldType>Email</fieldType>
</field>
...
</group>
</column>
</area>
форма должна загружать определенные элементы управления, соответствующие каждому типу поля в XML, например
- Название (показывает раскрывающийся список: мистер, миссис, доктор и т. д.)
- Текст (простое текстовое поле)
- Электронная почта (текстовое поле с подтверждением электронной почты)
- ZipCode (текстовое поле с проверкой почтового индекса)
Я хочу сделать каждый элемент управления отдельным модулем, который загружается, например, модуль ZipCode будет существовать в каталоге Modules в виде файла:
ZipCode.dll
это просто элемент управления простое текстовое поле, которое проверяется на основе почтового индекса, но разработчики могут создать другой элемент управления с именем:
ZipCodePlus.dll
который наследует тот же интерфейс, но предоставляет всплывающий селектор геолокации для почтовых индексов. Как только клиент заменит ZipCode.dll на ZipCodePlus.dll, все его формы будут иметь эту новую функциональность strong > для поиска почтовых индексов.
Однако у меня возникли проблемы с визуализацией того, как это будет технически реализовано, поскольку, поскольку мой класс формы анализирует XML, он создает экземпляры классов, которые предоставляют функциональные возможности для элементов управления, но для того, чтобы создать экземпляр class, у меня должна быть ссылка на него:
SmartFormFieldZipCodePresenter smartFormFieldEmailPresenter
= container.Resolve<SmartFormFieldEmailPresenter>();
Но как я могу создать его динамически, то есть с именем класса в виде строки, и если этот класс не существует, он выдаст соответствующее исключение , например что-то вроде этого:
ПСЕВДОКОД:
try {
var smartFormFieldZipCodePresenter
= container.Resolve("smartFormFieldZipCodePresenter");
}
catch (ModuleDoesNotExistException) {
...
}