【问题标题】:Merge object #1 to object #2 for all existing properties of object #2对于对象 #2 的所有现有属性,将对象 #1 合并到对象 #2
【发布时间】:2012-07-25 17:18:53
【问题描述】:

我有一个相当冗长的对象,其中包含很多属性,我用它们将数据传输到 SQL 数据库。我现在想提供这个对象的“轻量级”版本,它只使用详细对象的一些属性。

我使用轻对象通过 REST api 提供,并使用详细对象来传输数据,因此理想情况下我也可以反转该过程(使用轻对象的现有属性覆盖详细对象的属性,然后保存到数据库)。

所有这些属性都将具有相同的数据类型,只要它们存在于灯光对象中。

简单示例:

class Verbose {
  public string email;
  public Guid id;
}

class Simple {
  public string email;
  // don't show Guid
}

现在我想将 Verbose 类型的所有对象转换为 Simple 类型,放弃所有不必要的属性 - 有没有简单的方法可以做到这一点?

理想情况下,这也应该是可逆的。

【问题讨论】:

  • 难道你不能有一个 Verbose.ToSimple() 方法来创建并返回一个带有适当数据的新 Simple 对象吗?反之亦然(我猜你需要有默认/空值)
  • 这也是一个选项,但是每次更改为数据库对象时我都必须更改它。我的目标是在 Simple 对象类型中定义我想要公开的属性,然后自动将映射从 Verbose 委托给 Simple。
  • 在我的答案中的链接中编辑

标签: c#


【解决方案1】:

你可以编写一个构造函数来接受一个详细的对象 反之亦然。

public Verbose(Simple simple)
{
    this.id = Guid.NewGuid();
    this.email = simple.email;
}

public Simple(Verbose verbose)
{
    this.email = verbose.email;
}

这样,您将所有转换都集中在一个地方, 至少每个转化方向。

您可能会对这里的这个问题感兴趣: How to write a converter class? How to efficiently write mapping rules?

编辑对 OP 很重要

详细 => 简单

如果Simple 是Verbose 的子集,只需从Simple 派生Verbose。 这里不需要转换。

详细IS那么简单。

【讨论】:

  • 这是我要避免的——我必须手动分配每个属性。
  • 自动属性分配会有很多陷阱。尤其是在使用反射的时候,你会发现性能不是很好。
  • 我认为在这种情况下不是 - 所有数据类型在两个对象中都是相同的。
  • 你试图避免什么?手动编写转换或自动陷阱?
  • 手动转换。您能否详细说明可能存在哪些陷阱?
【解决方案2】:

您可以使用反射来遍历对象并读取它们的属性值。 在您的班级中添加此功能

private IEnumerable<PropertyInfo> GetValidInfoes()
{
    foreach (PropertyInfo info in GetType().GetProperties())
    {
         if (info.CanWrite)
            yield return info;
    }
}

将此循环添加到对您有意义的地方。

foreach (var item in GetValidInfoes())
{
     var source = myobject.GetType().GetProperty(item.Name);
     if (source != null)
        item.SetValue(this, source.GetValue(item.Name, item.PropertyType), null);
}

【讨论】:

  • 这取决于属性名称。性能下降肯定是这个问题。
【解决方案3】:

试试AutoMapper。如果你不使用展平,它可以是可逆的。

【讨论】:

  • 我一定会调查的,谢谢!除非有人知道不需要外部库的更简单的解决方案。
  • 外部库的优势在于它的作者投入了大量的时间和精力来使其正确快速地工作。不要发明轮子。
  • 我同意,但如果我只需要其中的一小部分,我会尽量避免使用大型库。不过我会考虑的,非常感谢!
猜你喜欢
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
相关资源
最近更新 更多