zen*_*dar 24 .net c# collections list
我有一个维护另一个类的对象列表的类.对象列表是公共属性.我想阻止用户直接添加和删除对象列表,如下所示:
MyObject.MyListProperty.Add(object);
Run Code Online (Sandbox Code Playgroud)
相反,我希望他们使用将在内部进行一些处理然后将对象添加到列表的方法.
我有一些想法:
List<T>并覆盖添加和删除是否有一些没有添加和删除的集合界面?
编辑:
我要去ReadOnlyCollection<T>.原因是包裹集可更新和变化将是只读对象立即可见(参见MSDN代码示例ReadOnlyCollection<T>和AsReadOnly()).这允许只读一次创建只读列表.
问题IEnumerable是对象可以被转换回原始对象List<T>然后直接操作.
Ode*_*ded 36
您可以使用ReadOnlyCollection - 将您的集合包装在其中并返回ReadOnlyCollection给您的类的用户:
return new ReadOnlyCollection(innerCollection);
Run Code Online (Sandbox Code Playgroud)
或者使用类的AsReadOnly方法List<T>:
return innerCollection.AsReadOnly();
Run Code Online (Sandbox Code Playgroud)
该IEnumerable的接口将你所需要的,因为它只有一个成员GetEnumerator(),那样只会让你遍历项目.
也许AsReadOnly方法可以解决这个问题,将只读实例交给public.
否则,IEnumerable<T>没有Add也没有Remove,所以你可以这样做:
private List<int> _myList;
public IEnumerable<int> MyList
{
get
{
return this._myList.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
我宁愿选择IEnumerable<T>(+副本)ReadOnlyCollection<T>,因为:对基本列表(从中创建只读集合)的更改将立即显示在您的只读集合的实例中.这可能导致锁定和straaange问题:)
您最简单的选择是通过公共属性将您的列表公开为以下IEnumerable,ICollection ReadOnlyCollection之一.
因此,您可以创建自己type的列表,将您Items的上述内容公开,但有一个内部添加方法,例如
public class MyList<MyType>
{
private List<MyType> items;
public MyList()
{
items = new List<MyType>();
}
public IEnumerable Items { get { return items.AsEnumerable(); } }
public Add(MyType item)
{
// do internal processing
items.Add(item);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6185 次 |
| 最近记录: |