.Net Слияние двух идентичных объектов, все свойства, рекурсивно, когда ноль - PullRequest
0 голосов
/ 02 июля 2018

У меня есть задача, в которой мне предоставлен базовый объект, который содержит объекты и примитивы из нашей службы данных, и соединить его с данными, предоставленными для идентичного объекта, который предоставляет клиент. Это должно закончиться тем, чтобы быть одним законченным объектом. Я буду ссылаться на объект как «MyObject».

Вот как выглядит объект из службы данных:

MyObject.FirstName = null
MyObject.LastName = null
MyObject.DataProperty1 = anotherobject
   anotherobject.property1 = somevalue1
   anotherobject.property2 = somevalue2
   anotherobject.property2 = somevalue2
MyObject.DataProperty2 = yetanotherobject
   yetanotherobject.property1 = someothervalue1
   yetanotherobject.property2 = someothervalue2
   yetanotherobject.property3 = someothervalue3
   yetanotherobject.property4 = someothervalue4

Вот как выглядит объект, когда он предоставляется клиентской стороной

MyObject.FirstName = John
MyObject.LastName = Doe
MyObject.DataProperty1 = anotherobject
   anotherobject.property1 = null
   anotherobject.property2 = null
   anotherobject.property2 = null
MyObject.DataProperty2 = yetanotherobject
   yetanotherobject.property1 = null
   yetanotherobject.property2 = null
   yetanotherobject.property3 = null
   yetanotherobject.property4 = null

Я не могу ожидать, чтобы точно знать, какие объекты подэлементов будут нулевыми или нет, но я знаю, что рекурсивно, мне нужен окончательный объединенный объект, который будет содержать фактические данные из обоих исходных объектов, а не нули. Очевидно, что объекты будут намного сложнее, чем то, что я напечатал выше, но суть моего вопроса верна.

Я пытался сделать что-то вроде слияния двух объектов в C # Я не мог понять не примитивы.

Я действительно не думаю, что это задача для AutoMapper, поскольку тип MyObject - это один и тот же класс как для клиента, так и для стороны данных. Не имеет смысла сопоставлять его с собой.

Жаль, я не могу просто пойти MyObject1 + MyObject2 = NewCombinedObject, ха-ха.

Кроме того, это унаследованный код, и я понимаю, что это вовсе не «лучшая практика». Тем не менее, нужно решить проблему.

1 Ответ

0 голосов
/ 02 июля 2018

Я вижу две проблемы, с которыми вы столкнетесь при этом, которые являются потенциальными ограничителями показа: ссылки на вложенные объекты и дети, которые ссылаются на своих родителей . Оба могут привести к бесконечным сценариям рекурсии и ошибкам нехватки памяти.

Вы можете смягчить проблему вложенности, просто решив, что не будете сливаться глубже, чем, скажем, x уровней глубиной. Это не идеал, но он может предотвратить бесконечную рекурсию для этого сценария.

Проблема с детьми, обращающимися к своим родителям, является более сложной. Вы должны иметь возможность сопоставить объединенные объекты с их оригиналами, а затем в выходных данных сопоставить ссылающийся узел с тем, который вы уже слили. Это не задача для слабонервных.

Это задача, которую AutoMapper не может сделать для вас? Если это так, моя интуиция говорит мне, что он сделает это для вас гораздо лучше, чем вы можете изобрести это заново, и с гораздо меньшим риском ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...