Если вам нужно настраиваемое и расширяемое решение, то одним из способов сделать это будет подход, основанный на дате.В одной из моих предыдущих работ мы должны были создать динамический пользовательский интерфейс, основанный на предпочтениях клиента, где поле 1 было применимо к одному клиенту, но другое не требовалось.Расширяя этот подход к вашему вопросу, вам понадобятся таблицы БД
TasksTable with following columns
1.TaskId
2.TaskName
3.ClassName (you will use reflection to create an instance of it)
Другая таблица с фактическими полями для задач.Давайте пока назовем это TaskFields.
TaskFields Table
1. TaskFieldId
2. Property (You can create another field to store the Name if you need to)
3. Enabled (bit)
4. SpecialFormat <if you need to apply this and customize it based on some preference)
Это довольно маленькие таблицы.Загрузите их при запуске приложения.В вашем приложении свяжите свой ListBox с полем TaskName в TasksTable.Когда выбран конкретный элемент, динамически создавайте элементы управления на основе значений в таблице TaskFields для выбранного элемента.Создайте класс на основе поля ClassName и свяжите привязки создания с сгенерированными элементами управления.
Это сложно, но преимущество, которое вы получаете, заключается в том, что вы можете включить или выключить элементы управления для отображения.
РЕДАКТИРОВАТЬ: Если вы планируете использовать подход атрибутов, может быть полезно следующее.Исходя из ваших примеров, вы уже отмечаете нужные свойства как Datamember.Поэтому вам не нужно определять какой-либо пользовательский атрибут, если только у вас нет других свойств, которые не будут использоваться для пользовательского ввода, но сами помечены как DataMember для других целей.
Dim type As Type = GetType(yourClass)
Dim properties As PropertyInfo() = type.GetProperties()
Dim neededProperties = (From [property] In propertiesLet attributes = DirectCast([property].GetCustomAttributes(GetType(DataMemberAttribute), False), Attribute()) Where attributes.Count() > 0[property]).ToList()