2012-07-25 63 views
1

我有一个比较冗长的对象,它有很多用于将数据传输到SQL数据库的属性。我现在想提供这个对象的“浅”版本,它只使用了一些详细的属性。为对象#2的所有现有属性合并对象#1到对象#

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

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

简单的例子:

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

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

现在我想变换类型冗长的所有对象类型的简单,抛弃所有不必要的性能 - 有一个简单的方法来做到这一点?

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

+0

难道你没有一个Verbose.ToSimple()方法创建并返回一个新的Simple对象与适当的数据?反之亦然(我想你会需要有默认值/空值) – davenewza 2012-07-25 08:54:30

+0

这也是一个选项,但是每当我改变为数据库对象时,我都必须改变它。我的目标是定义我希望在Simple对象类型中公开的属性,然后自动将从Verbose映射委托给Simple。 – doque 2012-07-25 09:06:35

+0

编辑在我的回答链接 – 2012-07-25 09:12:14

回答

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一个子集,只得到VerboseSimple。 这里不需要转换。

详细IS a简单。

+0

这就是我想要避免的 - 我必须手动分配每个属性。 – doque 2012-07-25 09:01:33

+0

automagic财产分配将有很多陷阱。特别是在使用反射时,你会发现性能不是很好。 – 2012-07-25 09:05:08

+0

我认为不是在这种情况下 - 所有数据类型在两个对象中都是相同的。 – doque 2012-07-25 09:05:57

1

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

+0

我一定会看看,谢谢!除非有人知道更简单的解决方案,而不需要外部库。 – doque 2012-07-25 09:14:57

+0

外部图书馆的优势在于其作者专注于时间并投入大量精力使其正确,快速地工作。不要发明轮子。 – Rafal 2012-07-25 09:19:01

+0

我同意,但我试图避免使用大型图书馆,如果我只需要它的一小部分。我会考虑它,所以非常感谢你! – doque 2012-07-25 09:22:16

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); 
} 
+1

这取决于属性名称。而这次的性能问题肯定会成为问题。 – 2012-07-25 09:01:38