迭代列表并修改对象正在更新原始文件

时间:2013-01-11 14:23:52

标签: c# list bindinglist

出于某种原因,我似乎无法确定我做错了什么。我尝试了一些事情,每次修改原始记录。

我有一个特定类的列表。我正在迭代列表,如果满足特定条件,我需要为此迭代创建一个重复项,修改2个值,然后将其添加到最终列表。除非我每次修改我创建的副本,否则会在原始值中修改这些值。数据是一个绑定列表,设置为列表。

// MyClasses is a BindingList<MyClass>
List<MyClass> classesToSave = new List<MyClass>();
foreach (var class in MyClasses)
{
    classesToSave(class);

    if (class.NeedsDupe)
    {
        MyClass dupeClass = new MyClass();
        dupeClass = class;
        dupeClass.NeedsDupe = false;
        dupeClass.IsDupe = true;
        classesToSave(dupeClass);
    }
}

让我们说通过第一次迭代,MyClasses中的第一项有class.NeedsDupe == true和class.IsDupe == false。在条件被命中之前将类添加到classesToSave时,classesToSave中的唯一条目是原始类(class.NeedsDupe == true和class.IsDupe == false)。但是,当条件被命中并且dupeClass对象被修改并且在将dupeClass添加到classesToSave之前,则会修改classesToSave中的原始条目(并且只有条目)。

我完全错过了什么吗?我有一种感觉,我正在画一个大脑放屁,可能需要参考旧物体?或者我是以某种方式复制BindingList的属性,当我更改我认为是新对象的dupeClass对象时,我实际上导致更改波动回来了?

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

以下几行存在问题。 dupeclass引用该类;他们指向同一个对象。不要使它们相等,而是将dupeClass的属性设置为等于class的属性。

MyClass dupeClass = new MyClass();
dupeClass = class;

答案 1 :(得分:2)

在这一行中,您将创建一个新的MyClass实例:

MyClass dupeClass = new MyClass();

但是你会立即用原始文件覆盖它:

dupeClass = class;

从那时起,dupeClassclass都引用同一个对象,因此对dupeClass的更改也会class

答案 2 :(得分:2)

这是类的本质,它们是引用类型。为MyClass

创建一个拷贝构造函数
class MyClass
{
   public MyClass(MyClass myClass)
   {
       //Assign the properties here
       //this.x = myClass.x;
       //....
       //....
   }
}

然后你打电话

MyClass dupeClass = new MyClass(@class);

答案 3 :(得分:0)

您正在创建一个新实例,然后将旧实例分配给它

MyClass dupeClass = new MyClass();
        dupeClass = class;

UPDATE  您必须手动复制属性或使用反射

foreach (var property in oldObject.GetType().GetProperties())
            {
                var prop= newObject.GetType().GetProperty(property.Name);
                if (prop!= null)
                    prop.SetValue(newObject, property.GetValue(oldObject));
            }