4

我在程序集 A (DLL) 中有一个对象链接列表(可以更改为任何其他 Collection 类型,只要它保持条目顺序)。

当程序集 B 从包含所述 LinkedList 的类创建对象时,它会分配一个方法来报告一些信息。该方法采用的参数之一是 LinkedList。

现在我希望程序集 B 中的这个方法能够从该 LinkedList 中读取(遍历它并根据它的内容做一些事情),但是我需要防止该方法更改列表中的数据。

虽然我现在是使用程序集 A 的人,但当它公开时,我需要防止从程序集外部更改数据,这样使用库的第 3 方就不会对程序集内的结果感到不安。

基本上,我希望“密封”将 LinkedList 从程序集 A 带到程序集 B 的参数

我说得有道理吗?

4

5 回答 5

7
new List<T>(linkedList).AsReadOnly();
于 2012-09-06T17:04:45.863 回答
4

如果您可以从 更改LinkedList<T>List<T>,则可以使用该AsReadOnly()方法生成列表的只读包装器。包装器是轻量级的,不需要复制,并立即将更改反映到底层集合:

List<MyClass> originalList = ...
IList<MyClass> readOnly = originalList.AsReadOnly();
于 2012-09-06T17:05:09.660 回答
2

不是将真正的链表传递给 B 的回调方法,而是传递一个副本。这样,B 可以对列表做任何想做的事情,而无需修改原始列表。

使用LinkedList(IEnumerable) 构造函数可以轻松创建链表的副本:

var copy = new LinkedList<MyType>(originalList);

显然,列表的元素可以由 B 修改,如果它们是可变的,但我相信你知道这一点。

于 2012-09-06T16:59:46.470 回答
2

我认为返回IEnumerable<T>而不是List<T>应该解决您的问题。最简单的方法:

foreach( var t in list )
    yield t;

这样,您将只返回枚举数。消费者将无法更改列表的内容。

于 2012-09-06T17:02:13.980 回答
0

你能发布一些代码。

听起来您想让他们使用数据的副本。这样,如果他们确实以某种方式对其进行了更改,原始副本将保持不变。

查看ICloneable复制对象的界面并创建一个全新的链表,其中包含所有原始内容的副本并将其传递回程序集 B。

于 2012-09-06T17:01:01.350 回答