是否有.NET集合接口阻止添加对象?

我有一个维护另一个类的对象列表的类。 对象列表是公共属性。 我想阻止用户直接添加和删除对象列表,如下所示:

MyObject.MyListProperty.Add(object); 

相反,我希望他们使用将在内部进行一些处理然后将对象添加到列表的方法。

我有一些想法:

  • 创建List后代并覆盖添加和删除
  • 通过属性getter返回列表的新副本(列表相对较短,不超过30个对象)

是否有一些没有添加和删除的集合界面?

编辑:
我将使用ReadOnlyCollection 。 原因是可以更新包装集合,并且只读对象中的更改将立即可见(请参阅ReadOnlyCollectionAsReadOnly() 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没有AddRemove ,所以你可以这样做:

 private List _myList; public IEnumerable MyList { get { return this._myList.ToList(); } } 

我宁愿选择IEnumerable (+ copy)和ReadOnlyCollection ,因为:更改到基本列表(从中创建只读集合)将立即显示在您的读取实例中只collections。 这可能导致锁定和straaange问​​题:)

开箱即用,只有IEnumerable将提供此function,而不会暴露任何可能欺骗客户端获取运行时exception的AddRemove公共方法。

如果您希望您的公共API明确声明该集合是只读的并且您需要索引器,则必须围绕现有的ListT[]编写自己的包装器。

你可以给它们一个总是返回一个可以用来访问结构的枚举器的对象吗?

如果你决定实现你的两个想法中的一个,那么它并不能真正回答你的问题,但它是有用的信息:你可以使用ToArray创建一个副本并返回一个数组。

或者您可以这样做: http : //en.csharp-online.net/CSharp_Generics_Recipes%E2%80%94Making_Read-Only_Collections_the_Generic_Way

ICollection(非generics版本)只获得IEnumerable + Count