保持旧对象而不更改它

时间:2014-03-09 13:37:10

标签: c# oop

我有以下代码,在RT中,当 mappingObject 更新时, oldObjToDel 会相应更新,但我的问题是:
有没有办法让 oldObjToDel 保留第一个引用,而不是像调用 updateReferance 方法后那样更改它?我希望 oldObjToDel 在更改 UpdateReferance 之前保留对象...

private bool UpdateMapping(out  MappingFields oldObjToDel)
{
    MappingFields mappingObject = GetMappingLabelObject(textbox.Name);
    oldObjToDel = mappingObject;
    isAdded = UpdateReferance(  mappingObject);
}

internal class MappingFields
{
    public string Type { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public bool isFound { get; set; }
}

2 个答案:

答案 0 :(得分:3)

在一般情况下,无法自动执行此操作。你需要制作一个对象的副本(克隆),它独立于它的"源"。

如果您的对象只有标量字段,那么您可以使用object.MemberwiseClone;否则,您应该考虑实现ICloneable并提供具有适当语义的Clone实现。 MemberwiseClone的文档还列出了几种备选方案:

  

如果有多种方法可以实现深层复制操作   由MemberwiseClone方法执行的浅复制操作   不符合你的需求。其中包括以下内容:

     
      
  • 打电话给上课   要复制的对象的构造函数,以创建第二个对象   从第一个对象获取的属性值。这假定了   对象的值完全由其类构造函数定义。
  •   
  • 调用MemberwiseClone方法创建对象的浅表副本,   然后分配其值与原始值相同的新对象   对象为其值为引用类型的任何属性或字段。   示例中的DeepCopy方法说明了这种方法。
  •   
  • 序列化要深度复制的对象,然后恢复   序列化数据到不同的对象变量。
  •   
  • 使用反射   递归以执行深层复制操作。
  •   

<强>更新

由于MappingFields的实现仅使用字符串和布尔字段,MemberwiseClone将完成这项工作。首先公开Clone方法:

internal class MappingFields : ICloneable
{
    public string Type { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public bool isFound { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();
    }

}

然后调用它:

oldObjToDel = (MappingFields)mappingObject.Clone();

答案 1 :(得分:1)

您可以使用AutoMapper轻松创建原始对象的克隆。我想this post可以对如何做到这一点有所了解。您还可以查看AutoMapper getting started页面。

希望我帮忙!