我有一个相当冗长的对象,其中包含许多属性,用于将数据传输到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类型,抛弃所有不必要的属性 - 有一种简单的方法吗?
理想情况下,这也应该是可逆的。
答案 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非常重要
详细=>简单
如果Simple
是Verbose
的子集,则只需从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。如果你不使用扁平化,它可以是可逆的。