我有以下代码,在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; }
}
答案 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页面。
希望我帮忙!