如何在使用get属性公开List的同时使List的Add方法受到保护?

我有一个名为WhatClass的类,其中包含List字段。 我需要能够只读这个字段,所以我使用get属性将它暴露给其他对象。

public class WhatClass { List _SomeOtherClassItems; public List SomeOtherClassItems { get { return _SomeOtherClassItems; } } } 

然而事实certificate任何对象都可以调用

 WhatClass.SomeOtherClassItems.Add(item); 

我怎么能阻止这个?

正如其他人所说,您正在寻找.AsReadOnly()扩展方法。

但是,您应该存储对集合的引用,而不是在每次属性访问期间创建它:

 private readonly List _items; public WhatClass() { _items = new List(); this.Items = _items.AsReadOnly(); } public ReadOnlyCollection Items { get; private set; } 

这是为了确保x.Items == x.Items成立,否则API消费者可能会非常意外。

公开ReadOnlyCollection<>将您的只读集合的​​意图传达给消费者。 对_items更改将反映在Items

使用List.AsReadOnly

 public ReadOnlyCollection SomeOtherClassItems { get { return _SomeOtherClassItems.AsReadOnly(); } } 

这将返回一个ReadOnlyCollection ,如果客户端通过接口调用Add,则会抛出exception。 此外,ReadOnlyCollection类型不公开公共Add方法。

您正在寻找ReadOnlyCollection类 ,它是IList的只读包装器。

由于ReadOnlyCollection将反映基础列表中的更改,因此您不需要每次都创建新实例。

例如:

 public class WhatClass { public WhatClass() { _SomeOtherClassItems = new List(); SomeOtherClassItems = _SomeOtherClassItems.AsReadOnly(); } List _SomeOtherClassItems; public ReadOnlyCollection SomeOtherClassItems { get; private set; } } 

使用AsReadOnly()怎么样? – MSDN文档