C#如何在类实例之间保留数据

时间:2017-06-28 20:09:22

标签: c# list static instance-variables

所以我之前曾问过这个问题并且认为我得到了答案,不幸的是答案并没有像我需要的那样表现,所以我再次要求进一步解释我想要的行为。

以下是我之前提问的链接: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个副本)。

如有必要,我可以提供更多详细信息,如果需要,可以提供测试代任何想法都会非常有用。

3 个答案:

答案 0 :(得分:0)

您应该使用单例模式,因此您将只有一个A类实例,并且可以从应用程序的任何位置访问它。所以A类中的数据将被共享,可以从B类和C类以及任何其他类访问。​​

答案 1 :(得分:0)

因此,您在每个实例中都获得了相同的属性值,因为您要将相同的实例添加到列表中。该列表有5个条目,都指向同一个对象。

要解决此问题,您可以克隆ProductList的当前实例(或使用正确的属性值创建新实例)并将其添加到列表中,而不是添加实际的当前实例。这样,列表中的每个条目都将指向不同的对象,更新当前对象不会影响它们。

答案 2 :(得分:0)

在Singleton模式之后似乎就像你一样。 关于C#中Singleton的各种实现,John Skeet有一个很好的article。您可以选择一个适合您需求的产品。