Удобство управления IList или “ленивое программирование” - защита IList.Добавить метод

StackOverflow https://stackoverflow.com/questions/554159

  •  23-08-2019
  •  | 
  •  

Вопрос

Как вы управляете этим простым сценарием, когда у вас есть объект со списком элементов?НАПРИМЕР:

public class ContainerObject
{
    IList<ChildObject> Children { get; }

    public void AddCustom(ChildObject toAdd)
    {
        // Some validation ...
        Children.Add(toAdd);
    }
}

Предполагая, что коллекция инициализирована реализацией IList, есть ли какой-либо способ контролировать способ добавления элементов в список?

Например, у меня есть другой метод в классе ContainerObject, который принимает дочерний объект и добавляет его в список.Этот метод необходим для выполнения некоторой базовой проверки дочернего объекта перед его добавлением.

Я ленив в том смысле, что не хочу возиться и писать пользовательский интерфейс списка (без метода add), который необходимо реализовать потребляющим разработчикам.Я также использую метод ToList() в интерфейсе IQueryable, так что это еще одна причина придерживаться IList - он просто работает.

Итак, существует ли подход, при котором вы можете контролировать, как элементы добавляются в экземпляр IList, т.е.запретить использование метода Add и разрешить добавление в коллекцию только с помощью моего пользовательского метода, или я просто прошу о невозможном?...и быть ленивым :(

Я могу придумать несколько хакерских способов проверить, когда элементы добавляются с помощью моего пользовательского метода или непосредственно в список, но они кажутся хакерскими!

Кто-нибудь испытывал что-нибудь подобное этому?Если да, то что вы сделали?

Это было полезно?

Решение

Вернуть a Только для чтения Коллекция миру, охватывающему ваш список, добавлениями к которому вы управляете.

Другие советы

Вы можете заставить свое свойство возвращать оболочку вокруг исходного списка, используя ReadOnlyCollection<T>.Это гарантирует, что вызывающие пользователи сами не добавят никаких элементов.Вы можете сохранить ссылку на исходный изменяемый список.Обратите внимание, что поскольку коллекция, доступная только для чтения, является всего лишь оболочкой, вызывающие устройства, которые кэшируют коллекцию, доступную только для чтения, все равно будут видеть дополнения, которые вы вносите в исходный список.Это может быть хорошо, а может и не быть, в зависимости от вашего ожидаемого использования.

Редактировать:Чтобы объяснить мой комментарий к кэшированию...

Предположим, клиент сделал:

IList<ChildObject> originalChildren = container.Children;    
container.AddChild(new ChildObject());
IList<ChildObject> updatedChildren = container.Children;    

с помощью Children свойство реализовано следующим образом:

private IList<ChildObject> children = new List<ChildObject>();
public IList<ChildObject> Children
{
    get { return new ReadOnlyCollection<ChildObject>(children); }
}

Тогда originalChildren и updateChildren будут ли оба иметь одинаковое содержимое - возвращенный ReadOnlyCollection не было бы моментальный снимок из коллекции детей на первой линии.Это было бы просто обертка по всей коллекции.Клиенты не смогли бы полагаться на то, что это не изменится - они просто не смогли бы изменить это сами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top