所以我之前曾问过这个问题并且认为我得到了答案,不幸的是答案并没有像我需要的那样表现,所以我再次要求进一步解释我想要的行为。
以下是我之前提问的链接:C# how can I preserve data between class instances?
以下是问题描述:
鉴于A级
如果A类包含List,我如何保存该列表中的数据,以便对象B和C(A类实例)可以访问列表中的数据(即使B和C都是他们自己的实例A类)?
**我应该注意,这是我尝试使用对象数据源实现的报告解决方案。
我认为以下代码是我的问题的解决方案
[DataObject]
public class Product
{
public string Name {get; set;}
public string Category {get; set;}
public int ID {get; set;}
// this method let's calling code add an instance of this class to the
// to the ProductList
public void AddItemsToList()
{
ProductList.Add(this);
}
// static list allows me to preserve the list data
public static List<Product> ProductList =
new List<Product>();
// This method is used to return an IEnumberable object to my reporting
// solution (Telerik Reports)
[DataObjectMethod(DataObjectMethodType.Select)]
public IEnumerable<Product> GenerateReport()
{
return ProductList;
}
}
上面代码的问题是每次我用实例更新静态列表时,它都会覆盖之前调用List.Add()的数据。因此,如果我添加此产品类的5个实例(每个都设置了不同的属性值),我的列表将包含5个项目,所有项目都具有最近设置的属性值。
我需要什么:我需要我的列表不仅保留我的数据(不知何故),而且确保我的列表包含每个实例的副本(不仅仅是添加到列表中的最后一个实例的5个副本)。
如有必要,我可以提供更多详细信息,如果需要,可以提供测试代任何想法都会非常有用。
答案 0 :(得分:0)
您应该使用单例模式,因此您将只有一个A类实例,并且可以从应用程序的任何位置访问它。所以A类中的数据将被共享,可以从B类和C类以及任何其他类访问。
答案 1 :(得分:0)
因此,您在每个实例中都获得了相同的属性值,因为您要将相同的实例添加到列表中。该列表有5个条目,都指向同一个对象。
要解决此问题,您可以克隆ProductList
的当前实例(或使用正确的属性值创建新实例)并将其添加到列表中,而不是添加实际的当前实例。这样,列表中的每个条目都将指向不同的对象,更新当前对象不会影响它们。
答案 2 :(得分:0)
在Singleton模式之后似乎就像你一样。 关于C#中Singleton的各种实现,John Skeet有一个很好的article。您可以选择一个适合您需求的产品。