На самом деле есть способ сделать это. Подумайте, как вы можете использовать Newtonsoft JSON для десериализации объекта из json. Он будет (или, по крайней мере, может) игнорировать отсутствующие элементы и заполнит все элементы, о которых он знает.
Так вот как я это сделал. Небольшой пример кода последует моему объяснению.
Создайте экземпляр вашего объекта из базового класса и заполните его соответствующим образом.
Используя класс jsonconvert для Newtonsoft json, сериализуйте этот объект в строку json.
Теперь создайте свой объект подкласса, десериализовав его строкой json, созданной на шаге 2. Это создаст экземпляр вашего подкласса со всеми свойствами базового класса.
Это работает как шарм! Итак ... когда это полезно? Некоторые люди спрашивали, когда это имеет смысл, и предлагали изменить схему OP, чтобы учесть тот факт, что вы не можете сделать это изначально с наследованием классов (в .Net).
В моем случае у меня есть класс настроек, который содержит все «базовые» настройки для сервиса. У определенных сервисов есть больше опций, и они приходят из другой таблицы БД, поэтому эти классы наследуют базовый класс. У них у всех разный набор опций. Таким образом, при извлечении данных для службы ПЕРВОЕ заполнение значений намного проще с использованием экземпляра базового объекта. Один из способов сделать это с помощью одного запроса к БД. Сразу после этого я создаю объект подкласса, используя метод, описанный выше. Затем я делаю второй запрос и заполняю все динамические значения объекта подкласса.
Окончательный вывод - это производный класс со всеми установленными параметрами. Повторение этого для дополнительных новых подклассов занимает всего несколько строк кода. Это просто и использует очень проверенный и проверенный пакет (Newtonsoft), чтобы волшебство заработало.
Этот пример кода vb.Net, но вы можете легко преобразовать в c #.
' First, create the base settings object.
Dim basePMSettngs As gtmaPayMethodSettings = gtmaPayments.getBasePayMethodSetting(payTypeId, account_id)
Dim basePMSettingsJson As String = JsonConvert.SerializeObject(basePMSettngs, Formatting.Indented)
' Create a pmSettings object of this specific type of payment and inherit from the base class object
Dim pmSettings As gtmaPayMethodAimACHSettings = JsonConvert.DeserializeObject(Of gtmaPayMethodAimACHSettings)(basePMSettingsJson)