例外:收集被修改;克隆()时抛出枚举操作可能不会执行

时间:2015-09-12 07:33:12

标签: c# .net clone observablecollection

我正在尝试编写一个info提供程序类。我想通过Clone()提供深层复制。所以我尝试的是:

public MyInfoClass Clone()
{
     MyInfoClass temp = (MyInfoClass)this.MemberwiseClone();
     foreach (MySystem sys in _mySystems)
     {
         temp.AddSys(sys);
     }
     return temp;
}

该集合如下。每当集合至少有一个对象时,它就抛出异常:

  

收藏被修改;枚举操作可能无法执行。

private ObservableCollection<MySystem> _mySystems;

public ObservableCollection<MySystem> MySystems
{
    get{ return _mySystems; }
}

我尝试调试并观察temp.AddSys(sys)成功执行,但在下一步抛出异常。你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

this.MemberwiseClone()生成成员的浅表副本,对于引用类型,两个对象具有相同的引用,因此您实际上是枚举和修改相同的集合。您需要创建一个新集合并将项目添加到其中。

 MyInfoClass temp = (MyInfoClass)this.MemberwiseClone();
 temp._mySystems = new ObservableCollection<MySystems>();

 foreach (MySystem sys in _mySystems)
 {
     temp.AddSys(sys);
 }

 return temp;