我在程序集A(DLL)中有一个对象的链接列表(可以更改为任何其他Collection类型,只要它保持条目顺序)。
当程序集B从包含所述LinkedList的类创建一个对象时,它会分配一个方法来报告一些信息。该方法采用的一个参数是LinkedList。
现在我希望程序集B中的这个方法能够从该LinkedList中读取(遍历它并根据它的内容进行处理),但是我需要阻止该方法更改List中的数据。
虽然我现在正在使用程序集A,但是当它公开时,我需要阻止数据从我的程序集外部更改,这样使用该库的第三方就不会对程序集中的结果产生影响。
基本上我希望'密封'将组件A中的LinkedList带到程序集B的参数
我有意义吗?
答案 0 :(得分:5)
new List<T>(linkedList).AsReadOnly();
答案 1 :(得分:3)
如果您可以从LinkedList<T>
更改为List<T>
,则可以使用AsReadOnly()
方法生成列表的只读包装。包装器是轻量级的,不需要复制,并立即反映对底层集合的更改:
List<MyClass> originalList = ...
IList<MyClass> readOnly = originalList.AsReadOnly();
答案 2 :(得分:2)
不是将真实的链接列表传递给B的回调方法,而是传递副本。这样,B可以对列表执行任何操作,而无法修改原始列表。
使用LinkedList(IEnumerable) constructor:
可以轻松创建链表的副本var copy = new LinkedList<MyType>(originalList);
显然,B的元素可以被B修改,如果它们是可变的,但我相信你已经知道了。
答案 3 :(得分:2)
我认为返回IEnumerable<T>
代替List<T>
可以解决您的问题。最简单的方法:
foreach( var t in list )
yield t;
这样您只会返回枚举器。消费者将无法更改列表的内容。
答案 4 :(得分:0)
你能发布一些代码吗?
听起来你想让他们使用数据副本。这样,如果他们以某种方式改变它,原始副本将保持不变。
查看ICloneable
接口以复制对象并创建一个全新的链接列表,其中包含所有原始内容的副本,并将其传递回程序集B.