.Net在null时递归合并两个相同的对象,所有属性

时间:2018-07-02 15:55:46

标签: c# .net object merge

我有一个任务,向我提供一个基础对象,该基础对象包含来自我们的数据服务的对象和基元,并将其与客户端提供的同一对象上提供的数据耦合。它最终需要成为一个完整的对象。我将对象称为“ 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

我不能期望确切地知道哪个子项对象将为空,但是我确实知道,我需要最终合并的对象来包含两个原始对象的实际数据,而不是空值。显然,这些对象将比我在上面键入的对象复杂得多,但是要问的问题是有效的。

我曾尝试做类似merging two objects in C#的事情,但我无法弄清非原始事物。

我真的不认为这是AutoMapper的任务,因为MyObject的类型对于客户端和数据端都是相同的类。将其映射到自身没有任何意义。

太糟糕了,我不能走 MyObject1 + MyObject2 = NewCombinedObject哈哈。

此外,这是旧代码,我意识到它根本不是“最佳实践”。不过仍然需要解决问题。

1 个答案:

答案 0 :(得分:0)

我可以看到您可能会遇到的两个问题,它们是潜在的阻碍因素:嵌套对象引用引用其父母的孩子。两者都可能导致无限递归方案和内存不足错误。

您可以通过简单地确定您合并的深度不超过x级来减轻嵌套问题。这不是理想的选择,但可以防止这种情况下的无限递归。

孩子指父母的问题更为复杂。您必须能够将合并的对象映射到其原始对象,然后在输出中将引用节点映射回您已经合并的对象。这不是胆小者的任务。

这是AutoMapper不能为您完成的任务吗?如果是这样,我的直觉告诉我,它将为您做的比重新发明好得多,并且大大降低了出错的风险。