Как сделать метод List Add method защищенным, пока выставляете List with get property?
У меня есть класс с именем WhatClass, в котором есть поле List. Мне нужно иметь возможность читать только это поле, поэтому я использовал свойство get, чтобы выставить его другим объектам.
public class WhatClass
{
List<SomeOtherClass> _SomeOtherClassItems;
public List<SomeOtherClass> SomeOtherClassItems { get { return _SomeOtherClassItems; } }
}
Однако оказывается, что любой объект может вызвать
WhatClass.SomeOtherClassItems.Add(item);
Как я могу предотвратить это?
Ответы
Ответ 1
Как говорили другие, вы ищете метод расширения .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
имеет значение true, что в противном случае могло бы оказаться неожиданным для пользователей API.
Экспонирование ReadOnlyCollection<>
связывает ваше намерение коллекции только для чтения с потребителями. Изменения _items
будут отражены в Items
.
Ответ 2
Вы ищете класс ReadOnlyCollection<T>
, который является оберткой только для чтения вокруг IList<T>
.
Поскольку ReadOnlyCollection<T>
будет отражать изменения в базовом списке, вам не нужно каждый раз создавать новый экземпляр.
Например:
public class WhatClass {
public WhatClass() {
_SomeOtherClassItems = new List<SomeOtherClass>();
SomeOtherClassItems = _SomeOtherClassItems.AsReadOnly();
}
List<SomeOtherClass> _SomeOtherClassItems;
public ReadOnlyCollection<SomeOtherClass> SomeOtherClassItems { get; private set; }
}
Ответ 3
Используйте List<T>.AsReadOnly
:
public ReadOnlyCollection<SomeOtherClass> SomeOtherClassItems
{
get
{
return _SomeOtherClassItems.AsReadOnly();
}
}
Это вернет ReadOnlyCollection, который выдает исключение, если клиент вызывает Add через интерфейс. Кроме того, тип ReadOnlyCollection не предоставляет публичный метод Add.
Ответ 4
Как насчет использования AsReadOnly()
? - Документация MSDN
Ответ 5
Вы можете просто использовать ToList(), чтобы вернуть копию списка. Другие классы могут делать то, что им нравится, с копией, это не изменит ваш первоначальный список.
Вы должны четко указать от имени, что они получают копию.
using System.Linq;
public class WhatClass
{
List<SomeOtherClass> _SomeOtherClassItems;
public List<SomeOtherClass> SomeOtherClassItems { get { return _SomeOtherClassItems.ToList(); } }
}