【发布时间】:2017-12-02 08:41:28
【问题描述】:
所以我之前曾问过这个问题,并认为我得到了答案,不幸的是,答案并没有像我需要的那样,所以我再次询问并进一步解释我想要得到的行为。
这是我上一个问题的链接:C# how can I preserve data between class instances?
问题描述如下:
给定 A 类
如果 A 类包含一个列表,我如何保留该列表中的数据,以便对象 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 个副本)。
如有必要,我可以提供更多详细信息,如果需要,我可以测试代码。任何想法都会非常有帮助。
【问题讨论】:
-
如果您实际上添加了 5 个不同的项目,那么您将拥有 5 个不同的项目。如果您的列表有 5 个相同项目的副本,那是因为您添加了 5 个相同项目的副本。也就是说,整个事情似乎是一个非常糟糕的主意。你不应该有这样的静态列表。任何代码都需要一个列表,其中一些项目应该有列表,并根据需要添加项目。
-
对……这很有道理。仅仅因为我多次调用 AddItemToList 并不意味着我将我的类的新实例添加到列表中(duh),我只是添加具有更新属性的相同实例。我会让我的调用代码在一个新实例中发送,看看是否有效。
-
如果您的问题涉及类
A、B和C,为什么您的代码示例没有显示这些?坦率地说,这个问题根本不清楚。我怀疑单身人士会在这里有所帮助。但是,您需要更好地解释您尝试了什么以及为什么没有奏效。解释为什么类B和C有它们自己的A实例,但由于某种原因需要访问A的某个other 实例所拥有的列表对象。您将得到的只是死胡同的答案,直到您能够更具体并以更清晰、更易于理解的方式提出您的问题。 -
你是对的。我想我在这里真的只处理 A 类和 A 类的多个对象,我想我应该说的是 B 和 C 或 A 类的对象。但是由于对象是 A 类的实例,它们有自己的副本,我需要对象 B 和 C 可以访问相同的底层数据,因此静态方法开始发挥作用。我将更新我的问题以更准确地反映问题所在。现在虽然看起来 Servy 让我走上了正轨,因为我的列表现在包含不同的副本。
-
@Servy 你肯定让我走上了正确的道路。我的列表现在包含不同的副本(我添加了同一实例的 5 个副本)。所以现在事情正在按我的预期工作,但我的报告现在有一些问题。不过,我可能会为此提出一个新问题。另外,我同意这可能不是我应该这样做的方式......我会看看我是否可以通读我正在使用的报告 API 并找到一种更合适的方法来从对象数据源将数据添加到我的报告中.谢谢!
标签: c# list static instance-variables