出于某种原因,我似乎无法确定我做错了什么。我尝试了一些事情,每次修改原始记录。
我有一个特定类的列表。我正在迭代列表,如果满足特定条件,我需要为此迭代创建一个重复项,修改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对象时,我实际上导致更改波动回来了?
感谢您的帮助。
答案 0 :(得分:2)
以下几行存在问题。 dupeclass引用该类;他们指向同一个对象。不要使它们相等,而是将dupeClass
的属性设置为等于class
的属性。
MyClass dupeClass = new MyClass();
dupeClass = class;
答案 1 :(得分:2)
在这一行中,您将创建一个新的MyClass实例:
MyClass dupeClass = new MyClass();
但是你会立即用原始文件覆盖它:
dupeClass = class;
从那时起,dupeClass
和class
都引用同一个对象,因此对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));
}