首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象#2的所有现有属性的对象#1合并到对象#2

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

Stack Overflow用户
提问于 2012-07-25 16:47:15
回答 3查看 2.1K关注 0票数 1

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

我使用轻量对象通过REST api提供数据,使用详细对象传输数据,所以理想情况下我也可以颠倒这个过程(用轻量对象的现有属性覆盖详细对象的属性,然后保存到数据库)。

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

简单的例子:

代码语言:javascript
复制
class Verbose {
  public string email;
  public Guid id;
}

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

现在我想把所有Verbose类型的对象都转换成Simple类型,去掉所有不必要的属性--有没有简单的方法呢?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-25 16:58:13

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

代码语言:javascript
复制
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?

与操作同样重要的编辑

Verbose =>简单

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

Verbose 是一种简单的。

票数 2
EN

Stack Overflow用户

发布于 2012-07-25 17:00:30

可以使用反射遍历对象并读取其特性值。在您的类中添加此函数

代码语言:javascript
复制
private IEnumerable<PropertyInfo> GetValidInfoes()
{
    foreach (PropertyInfo info in GetType().GetProperties())
    {
         if (info.CanWrite)
            yield return info;
    }
}

在对你有意义的地方添加这个循环。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-07-25 16:52:30

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11645927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档