1

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

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

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

简单的例子:

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

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

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

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

4

3 回答 3

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);
}
于 2012-07-25T09:00:29.930 回答
2

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

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

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

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

您可能会对这里的这个问题感兴趣: 如何编写转换器类?如何高效编写映射规则?

编辑对 OP 很重要

详细 => 简单

如果Simple是 的子集Verbose,则仅派生VerboseSimple。这里不需要转换。

那么详细一个简单的。

于 2012-07-25T08:58:12.613 回答
1

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

于 2012-07-25T08:52:30.280 回答