1

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

我有一个特定班级的清单。我正在遍历列表,如果满足特定条件,我需要为此迭代创建一个重复项,修改 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

4 回答 4

2

这就是类的本质,它们是引用类型。为 MyClass 创建一个复制构造函数

class MyClass
{
   public MyClass(MyClass myClass)
   {
       //Assign the properties here
       //this.x = myClass.x;
       //....
       //....
   }
}

然后你打电话

MyClass dupeClass = new MyClass(@class);
于 2013-01-11T14:48:21.460 回答
2

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

MyClass dupeClass = new MyClass();
dupeClass = class;
于 2013-01-11T14:26:46.630 回答
2

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

MyClass dupeClass = new MyClass();

但是你会立即用原来的覆盖它:

dupeClass = class;

从那时起,dupeClass并且class都引用同一个对象,因此dupeClass也对class.

于 2013-01-11T14:27:40.547 回答
0

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

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

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

foreach (var property in oldObject.GetType().GetProperties())
            {
                var prop= newObject.GetType().GetProperty(property.Name);
                if (prop!= null)
                    prop.SetValue(newObject, property.GetValue(oldObject));
            }
于 2013-01-11T14:26:03.490 回答