更改另一个对象属性时更改了不想要的对象属性

本文关键字:属性 对象 不想 一个对象 | 更新日期: 2023-09-27 17:50:38

从我在其他帖子中所理解的,我知道我的对象在内存中使用相同的位置,但如何分离这些对象?我试图使用new,但它不工作或我没有正确使用它。

注意这里没有粘贴setter和getter

class Supermarket
{
    List<Product> _products = new List<Product>{ };
    List<Customer> _customers = new List<Customer>{ };
}
class Customer
{
    List<Product> _purchased= new List<Product>{ };
}
class Product
{
    string _id;
    string _name;
    DateTime _expireDate;
    int _cost;
    int _count;
}

i在一个Method中添加一个Product

Product product = new Product(...);
supermarket.Products.Add(product);

和在另一种方法中,我想从Supermarket.Products复制产品Supermarket.Customers.Purchased。所以我想要一个副本,但是我拿不到。

这里我想让复制,但它不起作用。

Product product = supermarket.Products[productIndex];
supermarket.Customers[customerIndex].Purchased.Add(product);

现在的问题是,当我改变产品属性在客户类,产品属性在超市也会改变。例如

supermarket.Customers[customerIndex].Purchased.Last().Count = ...
//now the Product supermarket.Products[productIndex] will change too witch is unwanted

更改另一个对象属性时更改了不想要的对象属性

它不工作的原因是因为你只是通过添加产品对象的指针到列表中来做浅复制,而不是所有属性。所以如果你改变了一个,另一个也会受到相应的影响。

你可以在这个答案后面使用深度复制,但是这样你必须把你的类标记为[Serializable]。我认为最简单的方法是使用Json序列化器:

public static class CloneHelper 
{
    public static T Clone<T>(T source)
    {
        var serialized = JsonConvert.SerializeObject(source);
        return JsonConvert.DeserializeObject<T>(serialized);
    }
}
var copyProduct = CloneHelper.Clone<Product>(product);

或者简单地说,您可以按照下面的代码自己管理,然后它就可以工作了:

Product product = supermarket.Products[productIndex];
Product copyProduct = new Product() {
    Id = product.Id,
    Name = product.Name,
    ExpireDate = product.ExpireDate,
    Cost = product.Cost,
    Count = product.Count   
};
supermarket.Customers[customerIndex].Purchased.Add(copyProduct);
相关文章: