在运行时,我的程序使用相同的集合分配2个属性。 我拿了两个属性,这样如果更改为集合将由一个属性完成,第二个将保持相同的集合。但是在场景背后都指向同一个,我不能保持集合而不改变一个属性。 我要求这个确定并取消按钮,这样如果没有变化,一个属性会照顾或这个,如果做了更改,其他属性将负责处理。
我该如何管理?
像这样private void btnOK_Click(object sender, EventArgs e)
{
Program.currOrder.OrderItems[Program.editIndex].AppliedCustomization = lstBtn;//objFreecusatomization.AllAppliedItems;
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
private void btnCancel_Click(object sender, EventArgs e)
{
Program.currOrder.OrderItems[Program.editIndex].AppliedCustomization = actualBtnLIst;
this.DialogResult = DialogResult.Cancel;
}
这些是从其他一些程序中确定的2个属性
public List<btnObject> lstBtn;
public List<btnObject> actualBtnLIst { get; set; }
从其他程序这是如何设置
frmPrepare.actualBtnLIst = frmPrepare.lstBtn = Program.currOrder.OrderItems[currIdx].AppliedCustomization;
答案 0 :(得分:1)
很难说出你在问什么,但如果你想保留原始列表的副本,你需要复制而不是分配参考。
frmPrepare.lstBtn = Program.currOrder.OrderItems[currIdx].AppliedCustomization;
frmPrepare.actualBtnLIst = frmPrepare.lstBtn.ToList();
// ToList will create a copy of each item reference in the collection.
答案 1 :(得分:1)
创建实际列表时有两个选项,从原始列表中获取所有项目并将其填入新列表中,假设在for循环中(逐个传输所有属性的值),您可以同样也使用反射。
其他如果对象是序列化,则首先序列化原始列表,然后反序列化它,使其按值复制而不是通过引用复制。
对于第二个选项代码将是这样的:
using (var memoryStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, <Your Original List Object>);
memoryStream.Position = 0;
<You actual List Object> = binaryFormatter.Deserialize(memoryStream);
}