是否有.NET集合接口阻止添加对象?
我有一个维护另一个类的对象列表的类。 对象列表是公共属性。 我想阻止用户直接添加和删除对象列表,如下所示:
MyObject.MyListProperty.Add(object);
相反,我希望他们使用将在内部进行一些处理然后将对象添加到列表的方法。
我有一些想法:
是否有一些没有添加和删除的集合界面?
编辑:
我将使用ReadOnlyCollection
。 原因是可以更新包装集合,并且只读对象中的更改将立即可见(请参阅ReadOnlyCollection
和AsReadOnly()
MSDN代码示例)。 这允许只读一次创建只读列表。
IEnumerable
的问题是对象可以被转换回原始List
然后直接操作。
您可以使用ReadOnlyCollection – 将您的集合包装在其中并将ReadOnlyCollection
返回给您的类的用户:
return new ReadOnlyCollection(innerCollection);
或者使用List
类的AsReadOnly
方法:
return innerCollection.AsReadOnly();
IEnumerable接口将满足您的需求,因为它只有一个成员GetEnumerator()
,它只允许您遍历项目。
您最简单的选择是通过公共属性将您的列表公开为以下IEnumerable , ICollection ReadOnlyCollection之一 。
因此,您可以创建自己的列表type
,将您的Items
公开为上述Items
之一,但具有添加的内部方法,例如
public class MyList { private List items; public MyList() { items = new List (); } public IEnumerable Items { get { return items.AsEnumerable(); } } public Add(MyType item) { // do internal processing items.Add(item); } }
也许AsReadOnly方法可以解决这个问题,将只读实例交给public。
否则, IEnumerable
没有Add
或Remove
,所以你可以这样做:
private List _myList; public IEnumerable MyList { get { return this._myList.ToList(); } }
我宁愿选择IEnumerable
(+ copy)和ReadOnlyCollection
,因为:更改到基本列表(从中创建只读集合)将立即显示在您的读取实例中只collections。 这可能导致锁定和straaange问题:)
开箱即用,只有IEnumerable
将提供此function,而不会暴露任何可能欺骗客户端获取运行时exception的Add
和Remove
公共方法。
如果您希望您的公共API明确声明该集合是只读的并且您需要索引器,则必须围绕现有的List
或T[]
编写自己的包装器。
你可以给它们一个总是返回一个可以用来访问结构的枚举器的对象吗?
如果你决定实现你的两个想法中的一个,那么它并不能真正回答你的问题,但它是有用的信息:你可以使用ToArray创建一个副本并返回一个数组。
或者您可以这样做: http : //en.csharp-online.net/CSharp_Generics_Recipes%E2%80%94Making_Read-Only_Collections_the_Generic_Way
ICollection(非generics版本)只获得IEnumerable + Count
上述就是C#学习教程:是否有.NET集合接口阻止添加对象?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1030219.html