更改其他对象属性c#时更改了不需要的对象属性

时间:2015-05-25 18:43:55

标签: c# object properties copy instance

从我在其他帖子中的理解我知道我的对象在内存中使用相同的位置但是如何分离这些对象? 我尝试使用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;
}

我在一个方法中添加一个产品

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

1 个答案:

答案 0 :(得分:1)

它不起作用的原因是你只是通过将产品对象的指针添加到列表而不是所有属性中来进行浅拷贝。因此,如果你换一个,那么另一个会受到相应的影响。

您可以在this answer之后使用深层复制,但这样您必须将您的班级标记为[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);