Conveniência ou “programação preguiçoso” gestão IList - proteger método IList.Add

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

  •  23-08-2019
  •  | 
  •  

Pergunta

Como você administra este cenário simples quando você tem um objeto com uma lista de itens. EG:

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

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

Assumindo que a coleção é inicializado para uma implementação de IList, existe alguma maneira em que para controlar a maneira pela qual os itens são adicionados à lista?

Por exemplo, eu tenho um outro método na classe ContainerObject que leva um ChildObject e adiciona-lo à lista. Este método é necessário para executar alguma validação básica na ChildObject antes de adicionar-lo.

Eu estou sendo preguiçoso em que eu não quero mexer e escrever uma lista personalizada de interface (sem um método add) que os desenvolvedores consumindo precisa implementar. Eu também estou usando o método ToList () na interface IQueryable por isso esta é outra razão para ficar com IList - ele simplesmente funciona

.

Assim, há uma abordagem em que você pode policiar como os itens são adicionados à instância IList ou seja, evitar o uso do método Add e só permitir a adição à coleção através do meu método personalizado, ou estou apenas a pedir o impossível? ... e ser preguiçoso: (

Não consigo pensar em algumas maneiras hacky em que para verificar quando itens são adicionados através do meu método personalizado ou diretamente na lista, mas estes parecem hacky!

Qualquer experiência nada parecido com isso? Se assim for, o que você fez?

Foi útil?

Solução

Voltar a ReadOnlyCollection para o mundo envolvendo sua lista que você gerenciar a acrescenta a.

Outras dicas

Você pode fazer sua propriedade retornar um invólucro em torno da lista original usando ReadOnlyCollection<T> . Isso irá garantir que os chamadores não adicionar nenhum item em si. Você pode manter uma referência à lista mutável originais. Note-se que porque a coleção somente leitura é de apenas um invólucro, os chamadores que armazenar em cache a coleção somente leitura ainda verá adições que você faz com a lista original. Isso pode ou não pode ser uma coisa boa, dependendo da sua utilização prevista.

EDIT: Para explicar o meu cache comentário ...

Suponha que um cliente fez:

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

com a propriedade Children implementado assim:

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

Então originalChildren e updateChildren que ambos têm o mesmo conteúdo - o ReadOnlyCollection retornado não seria um snapshot da coleção das crianças na primeira linha. Seria apenas um embalagem em torno da coleção. Os clientes não seria capaz de contar com ele não mudar -. Eles simplesmente não seria capaz de mudar por si próprios

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top