2013-01-11 44 views
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 ==真,class.IsDupe ==假。在条件被打中之前,当class被添加到classesToSave时,classesToSave中唯一的条目是原始类(class.NeedsDupe == true,class.IsDupe == false)。但是,当条件被击中并且dupeClass对象被修改时,并且在dupeClass被添加到classesToSave之前,将修改classesToSave中的原始条目(并且只有条目)。

我完全错过了什么吗?我有一种感觉,我正在画一个大脑放屁,也许需要参考旧的对象?或者我以某种方式复制BindingList的属性,并且当我更改dupeClass对象时,我认为这是一个新对象,实际上导致更改涟漪穿过?

感谢您的任何帮助。

+2

你不能有一个在C#中命名为“类”的变量。 –

+0

嗯,这是一个简单的例子。显然不使用实际的类名。 – Tom

回答

2

那类的性质,它们是引用类型。为MyClass的

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

创建一个拷贝构造函数然后调用

MyClass dupeClass = new MyClass(@class); 
+0

我是个白痴。我只需要使用副本。显然这个类是一个引用类型。感谢您的跟进! – Tom

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)); 
      } 
+0

简单地删除第二行是不够的。原始对象需要被克隆。 –

2

以下线有问题的。 dupeclass引用这个类;他们指向同一个对象。不要使它们相等,请将dupeClass的属性设置为等于class的属性。

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

在这一行你创建MyClass的一个新的实例:

MyClass dupeClass = new MyClass(); 

但此时你立即与原来的覆盖它:

dupeClass = class; 

从那时起, dupeClassclass都引用相同的对象,所以,以dupeClass变化也对class制成。