【发布时间】:2014-07-05 22:20:28
【问题描述】:
我不知道这是否可能,但基本上,我想公开ReadOnlyCollection<ReadOnlyCollection<MyType>> 类型的属性,同时仍然能够修改暴露该属性的类中的底层集合。此外,我希望我的类的用户能够保存对返回集合的引用,以便它在我在暴露属性的类内部更新它时更新。
例如,如果这是一个单一的集合,我可以这样做:
public class MyClass {
private List<MyType> _List;
public ReadOnlyCollection<MyType> RList {
get {
return _List.AsReadOnly();
}
}
}
这仍然允许通过_List.Add() 将项目添加到我的班级内的列表中。此外,如果此类的客户要这样做,请说:
var collectionRef = myClassInstance.RList;
然后collectionRef 也会随着我从MyClass 内部向列表中添加元素而改变。
如果我想要一个列表,就会出现问题:
private List<List<MyType>> _List;
public ReadOnlyCollection<ReadOnlyCollection<MyType>> RList {
get {
return _List.AsReadOnly();
}
}
上述尝试的直接问题是AsReadonly() 仅适用于外部列表。所以我会尝试返回一个ReadOnlyCollection<List<MyItem>>,它不是该属性的声明类型。我能想到的满足声明的属性类型的唯一方法是创建一个新的ReadOnlyCollection,其方式类似于:
new ReadOnlyCollection<ReadOnlyCollection<MyItem>>(_List)
或
new ReadOnlyCollection<ReadOnlyCollection<MyItem>>() {
new ReadOnlyCollection<MyItem>(_List[0]),
new ReadOnlyCollection<MyItem>(_List[1]),
...
}
但我不确定创建这个嵌套集合的语法是什么;此外,我不确定是否通过创建“新”集合,我将无法通过对属性返回值的引用来跟踪对基础列表的更改。也就是说,如果在 MyClass 里面我做 _List[1].Add(myTypeInstance) 我不确定持有只读版本引用的人会看到那个新项目。
我对其他方法持开放态度。基本上,我只需要公开一个项目列表列表,该列表是只读的,但可以在公开属性的类中进行修改,并且客户端能够看到反映的更改,而无需再次从属性访问器获取值。
【问题讨论】: