Convenienza o “pigro programmazione” gestione IList - proteggere metodo IList.Add

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

  •  23-08-2019
  •  | 
  •  

Domanda

Come si fa a gestire questo semplice scenario quando si possiede un oggetto con un elenco di elementi. EG:

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

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

Supponendo che la collezione viene inizializzata ad un'implementazione di IList, c'è un modo in cui per controllare il modo in cui vengono aggiunti alla lista articoli?

Per esempio, ho un altro metodo nella classe ContainerObject che prende un ChildObject e lo aggiunge alla lista. Questo metodo è richiesto per eseguire alcune convalida di base sul ChildObject prima di aggiungerlo.

io sia pigra nel senso che io non voglio per fare un giro e scrivere un'interfaccia elenco personalizzato (senza un metodo add) che gli sviluppatori che consumano devono implementare. Sono anche utilizzando il metodo ToList () sull'interfaccia IQueryable quindi questo è un altro motivo per attaccare con IList -. Solo funziona

Quindi, c'è un approccio in cui si può polizia come gli elementi vengono aggiunti all'istanza IList vale a dire impedire l'utilizzo del metodo Add e consentire solo aggiungendo alla raccolta tramite il mio metodo personalizzato, o sto solo chiedendo l'impossibile? ... e di essere pigro: (

Mi vengono in mente un paio di modi in cui hacky per controllare quando gli elementi vengono aggiunti tramite il mio metodo personalizzato o direttamente sulla lista, ma questi sembrano hacky!

Chiunque sperimentare qualcosa di simile a questo? Se è così, che cosa hai fatto?

È stato utile?

Soluzione

ReadOnlyCollection al mondo avvolgendo la vostra lista che si gestire l'aggiunge.

Altri suggerimenti

È possibile effettuare la vostra proprietà restituisce un wrapper per la lista originale utilizzando ReadOnlyCollection<T> . Questo farà sì che i chiamanti non aggiungono nessun articolo stessi. È possibile mantenere un riferimento alla lista mutabile originale. Si noti che, poiché la raccolta di sola lettura è solo un involucro, i chiamanti che cache l'raccolta di sola lettura potranno ancora vedere le aggiunte apportate alla lista originale. Questo può o non può essere una buona cosa a seconda del vostro uso previsto.

EDIT: Per spiegare il mio commento caching ...

Si supponga che un cliente ha fatto:

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

con la proprietà Children implementata in questo modo:

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

Poi originalChildren e updateChildren sarebbero entrambi hanno lo stesso contenuto - il ReadOnlyCollection restituito non sarebbe un snapshot della collezione dei bambini in prima linea. Sarebbe solo un involucro intorno alla collezione. I client non sarebbero in grado di fare affidamento su di essa non cambiando -. Solo che non sarebbero in grado di cambiare se stessi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top