C# 如何在 class 个实例之间保留数据
C# How to preserve data between class instances
所以我之前曾问过这个问题并认为我得到了答案,不幸的是答案并不像我需要的那样,所以我再次询问并进一步解释我想要得到的行为。
这里是 link 我之前的问题:
问题描述如下:
给定class一个
如果 Class A 包含一个列表,我如何保留该列表中的数据以便对象 B 和 C(class A 的实例)可以访问列表中的数据(甚至如果 B 和 C 都新建了自己的实例 Class 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 个实例 class(每个都设置了不同的 属性 值),我的列表将包含 5 个项目,所有项目都具有最近设置的 属性 值。
我需要什么:我需要我的列表不仅(以某种方式)保留我的数据,而且确保我的列表包含每个实例的副本(不仅仅是添加到列表中的最后一个实例的 5 个副本)。
如有必要,我可以提供更多详细信息,如果需要,我可以提供测试代码。任何想法都会很有帮助。
您应该使用单例模式,这样您将只有一个 class A 实例,并且可以从应用程序中的任何位置访问它。因此 class A 中的数据将被共享,并且可以从 class B 和 C 以及任何其他 classes.
访问
因此,您将在每个实例中获得相同的 属性 值,因为您将 相同的 实例添加到列表中。该列表有 5 个条目都指向同一个对象。
要解决此问题,您可以克隆 ProductList
的当前实例(或使用正确的 属性 值创建一个新实例)并将其添加到列表中,而不是添加实际的当前实例实例。这样列表中的每个条目将指向不同的对象并且更新当前对象不会影响它们。
您似乎在追求单例模式。
John Skeet 对 Singleton 在 C# 中的各种实现有很好的 article。您可以选择适合您的需求。
所以我之前曾问过这个问题并认为我得到了答案,不幸的是答案并不像我需要的那样,所以我再次询问并进一步解释我想要得到的行为。
这里是 link 我之前的问题:
问题描述如下:
给定class一个
如果 Class A 包含一个列表,我如何保留该列表中的数据以便对象 B 和 C(class A 的实例)可以访问列表中的数据(甚至如果 B 和 C 都新建了自己的实例 Class 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 个实例 class(每个都设置了不同的 属性 值),我的列表将包含 5 个项目,所有项目都具有最近设置的 属性 值。
我需要什么:我需要我的列表不仅(以某种方式)保留我的数据,而且确保我的列表包含每个实例的副本(不仅仅是添加到列表中的最后一个实例的 5 个副本)。
如有必要,我可以提供更多详细信息,如果需要,我可以提供测试代码。任何想法都会很有帮助。
您应该使用单例模式,这样您将只有一个 class A 实例,并且可以从应用程序中的任何位置访问它。因此 class A 中的数据将被共享,并且可以从 class B 和 C 以及任何其他 classes.
访问因此,您将在每个实例中获得相同的 属性 值,因为您将 相同的 实例添加到列表中。该列表有 5 个条目都指向同一个对象。
要解决此问题,您可以克隆 ProductList
的当前实例(或使用正确的 属性 值创建一个新实例)并将其添加到列表中,而不是添加实际的当前实例实例。这样列表中的每个条目将指向不同的对象并且更新当前对象不会影响它们。
您似乎在追求单例模式。 John Skeet 对 Singleton 在 C# 中的各种实现有很好的 article。您可以选择适合您的需求。