Conveniencia o “programación perezoso” gestión IList - la protección método IList.Add

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

  •  23-08-2019
  •  | 
  •  

Pregunta

¿Cómo gestionar este escenario simple cuando se tiene un objeto con una lista de elementos. EG:

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

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

Suponiendo que la colección se inicializa a una implementación de IList, ¿hay alguna manera en la que para controlar la forma en que los elementos se añaden a la lista?

Por ejemplo, tengo otro método en la clase ContainerObject que toma un ChildObject y lo añade a la lista. Este método es necesario para llevar a cabo una validación básica sobre el ChildObject antes de añadirla.

Estoy haciendo el vago en el que no quiero perder el tiempo y escribir una interfaz de lista personalizada (sin un método add) que los desarrolladores que consumen tienen que aplicar. También estoy usando el método ToList () en la interfaz IQueryable por lo que esta es otra razón para quedarse con IList -. Simplemente funciona

Entonces, ¿hay un enfoque en el que se puede vigilar cómo se agregan elementos a la instancia IList es decir, evitar el uso del método Add y sólo permiten la adición a la colección a través de mi método personalizado, o solo estoy pidiendo lo imposible? ... y ser perezoso: (

No puedo pensar en algunas maneras hacky en el que se comprueban cuando se añaden elementos a través de mi método personalizado o directamente en la lista, pero estos parecen hacky!

Cualquier persona experimenta algo similar a esto? Si es así, ¿qué hiciste?

¿Fue útil?

Solución

ReadOnlyCollection al mundo envolver su lista que se gestionar la suma a.

Otros consejos

Usted puede hacer su propiedad devuelve una envoltura alrededor de la lista original utilizando ReadOnlyCollection<T> . Esto asegurará que las personas que llaman no añaden ningún artículo en sí. Usted puede mantener una referencia a la lista original, mutable. Tenga en cuenta que debido a que la colección de sólo lectura es sólo una envoltura, que llaman la cual caché La colección de sólo lectura todavía se ven adiciones que se realicen en la lista original. Que puede o no puede ser una buena cosa dependiendo de su uso previsto.

EDIT: Para explicar mi comentario almacenamiento en caché ...

Supongamos que un cliente hizo:

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

con la propiedad Children implementado como esto:

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

A continuación, originalChildren y updateChildren serían ambos tienen el mismo contenido - la ReadOnlyCollection devuelto no sería un instantánea de la colección de los niños en la primera línea. Sólo sería un envoltorio en torno a la colección. Los clientes no serían capaces de confiar en que no cambia -. Simplemente no serían capaces de cambiar ellos mismos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top