对象#2的所有现有属性将对象#1合并到对象#2

时间:2012-07-25 08:47:15

标签: c#

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

我正在使用light对象通过REST api提供,而冗长的用于传输数据,所以理想情况下我也可以反转这个过程(用light对象的现有属性覆盖verbose对象的属性,然后保存到数据库)。

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

简单示例:

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

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

现在我想将Verbose类型的所有对象转换为Simple类型,抛弃所有不必要的属性 - 有一种简单的方法吗?

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

3 个答案:

答案 0 :(得分:2)

您可以编写一个带有详细对象的构造函数 反之亦然。

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非常重要

详细=>简单

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

详细 IS a Simple。然后。

答案 1 :(得分: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);
}

答案 2 :(得分:1)

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