考虑复制/克隆对象的后续方法(将所有字段复制到新对象中)
public AangepastWerk CloneAdjustedWork(AangepastWerk pAdjustedWork)
{
return new AangepastWerk()
{
AangepastWerkID = pAdjustedWork.AangepastWerkID,
ArbeidsOngeval = pAdjustedWork.ArbeidsOngeval,
DatumCreatie = pAdjustedWork.DatumCreatie,
DatumLaatsteWijziging = pAdjustedWork.DatumLaatsteWijziging,
DatumOngeval = pAdjustedWork.DatumOngeval,
GewijzigdDoor = pAdjustedWork.GewijzigdDoor,
NietErkend = pAdjustedWork.NietErkend,
Stamnummer = pAdjustedWork.Stamnummer,
Verzorging = pAdjustedWork.Verzorging,
VerzorgingId = pAdjustedWork.VerzorgingId
};
}
我有一个打开子表单的表单,其中传递了两个对象(上述类型的同一对象的2倍)。我打开这样的表格:
//my selected Record
Record rec = DateGridAdjustedWorks.ActiveRecord;
AangepastWerk AWorkObject = (AangepastWerk)((DataRecord)rec).DataItem;
AangepastWerk AWorkObjectBackup = _Vm.CloneAdjustedWork(AWorkObject);
WindowModifyAdjustedWork windowForModify = new WindowModifyAdjustedWork(AWorkObject,AWorkObjectBackup, true);
windowForModify.Closing += new CancelEventHandler(OnModifyAWClosing);
windowForModify.ShowDialog();
在那个子窗体中,我将第一个对象设置为DataContext。 _adjustedWork和_adjustedWorkCopy是表单
的属性 _adjustedWork = pAdjustedWork;
GridAdjustedWork.DataContext = AdjustedWork;
_adjustedWorkCopy = pAdjustedWorkCopy;
问题: 在形式中,我能够在保留原始对象的同时改变对象。用户可以看到原始对象,因此他有可能跟踪更改(用户请求)但是如果我在_adjustedWork(对象是我的datacontext)中更改了某些内容,那么我的_adjustedWorkCopy(没有对其执行任何操作)在我的代码隐藏中)也改变了。我对你聪明的问题是:为什么会发生这种情况,我该如何解决呢?我在这里缺少什么(可能是非常基本的东西)?
答案 0 :(得分:1)
我总是通过序列化到json进行深度克隆。
在Servicestack的示例中,您可以:
var json = myObject.ToJson();
var clonedObject = json.FromJson<MyObject>();
return clonedObject;
也许这会有所帮助。
答案 1 :(得分:0)
找到克隆对象收到更改的原因
public AangepastWerk CloneAdjustedWork(AangepastWerk pAdjustedWork)
{
return new AangepastWerk()
{
AangepastWerkID = pAdjustedWork.AangepastWerkID,
ArbeidsOngeval = pAdjustedWork.ArbeidsOngeval,
DatumCreatie = pAdjustedWork.DatumCreatie,
DatumLaatsteWijziging = pAdjustedWork.DatumLaatsteWijziging,
DatumOngeval = pAdjustedWork.DatumOngeval,
GewijzigdDoor = pAdjustedWork.GewijzigdDoor,
NietErkend = pAdjustedWork.NietErkend,
Stamnummer = pAdjustedWork.Stamnummer,
Verzorging = pAdjustedWork.Verzorging, <------------ Issue lies here
VerzorgingId = pAdjustedWork.VerzorgingId
};
}
pAdjustedWork.Verzorging在这种情况下是一个对象。我需要克隆这个对象。我假设(错误地)上面提到的克隆会创建一个新的单独的'VerzorgingsObject'。
我的问题的解决方案是:
MedicalCare_VM mcare_VM = new MedicalCare_VM();
return new AangepastWerk()
{
AangepastWerkID = pAdjustedWork.AangepastWerkID,
ArbeidsOngeval = pAdjustedWork.ArbeidsOngeval,
DatumCreatie = pAdjustedWork.DatumCreatie,
DatumLaatsteWijziging = pAdjustedWork.DatumLaatsteWijziging,
DatumOngeval = pAdjustedWork.DatumOngeval,
GewijzigdDoor = pAdjustedWork.GewijzigdDoor,
NietErkend = pAdjustedWork.NietErkend,
Stamnummer = pAdjustedWork.Stamnummer,
Verzorging = mcare_VM.CloneMedicalCare(pAdjustedWork.Verzorging),
VerzorgingId = pAdjustedWork.VerzorgingId
};
克隆:
Verzorging = mcare_VM.CloneMedicalCare(pAdjustedWork.Verzorging)
使用与前面提到的相同的逻辑(复制每个字段)。