У меня есть класс под названием WhatClass, который имеет поле List в нем. Я должен смочь к только для чтения это поле, таким образом, я использовал получить свойство для представления его другим объектам.
public class WhatClass
{
List<SomeOtherClass> _SomeOtherClassItems;
public List<SomeOtherClass> SomeOtherClassItems { get { return _SomeOtherClassItems; } }
}
Однако оказывается, что любой объект может звонить
WhatClass.SomeOtherClassItems.Add(item);
Как я могу предотвратить это?
Как уже сказали другие, вам нужен метод расширения .AsReadOnly()
.
Однако вам следует хранить ссылку на коллекцию, а не создавать ее при каждом обращении к свойству:
private readonly List<SomeOtherClass> _items;
public WhatClass()
{
_items = new List<SomeOtherClass>();
this.Items = _items.AsReadOnly();
}
public ReadOnlyCollection<SomeOtherClass> Items { get; private set; }
Это необходимо для того, чтобы гарантировать, что x.Items == x.Items
будет истинным, что в противном случае может быть очень неожиданным для потребителей API.
Выставление ReadOnlyCollection<>
передает потребителям ваше намерение создать коллекцию только для чтения. Изменения в _items
будут отражены в Items
.
Вы ищете ReadOnlyCollection
класс , который является оболочкой только для чтения вокруг IList
.
Поскольку ReadOnlyCollection
будет отражать изменения в базовом списке, вам не нужно каждый раз создавать новый экземпляр.
Например:
public class WhatClass {
public WhatClass() {
_SomeOtherClassItems = new List<SomeOtherClass>();
SomeOtherClassItems = _SomeOtherClassItems.AsReadOnly();
}
List<SomeOtherClass> _SomeOtherClassItems;
public ReadOnlyCollection<SomeOtherClass> SomeOtherClassItems { get; private set; }
}
Используйте List
:
public ReadOnlyCollection<SomeOtherClass> SomeOtherClassItems
{
get
{
return _SomeOtherClassItems.AsReadOnly();
}
}
Это вернет ReadOnlyCollection , который будет генерировать исключение, если клиент вызывает Add через интерфейс. Кроме того, тип ReadOnlyCollection не предоставляет общедоступный метод Add.
Как насчет использования AsReadOnly ()
? - Документация MSDN