-1

在运行时,我的程序分配 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;
4

2 回答 2

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.
于 2013-08-28T12:47:41.727 回答
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);
}
于 2013-08-28T12:52:20.037 回答