Commodité ou « programmation paresseuse » la gestion de IList - la protection de la méthode IList.Add

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

  •  23-08-2019
  •  | 
  •  

Question

Comment gérez-vous ce scénario simple quand vous avez un objet avec une liste d'éléments. EG:

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

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

En supposant que la collection est initialisée à une mise en œuvre de IList, est-il possible de contrôler où la manière dont les éléments sont ajoutés à la liste?

Par exemple, j'ai une autre méthode de la classe ContainerObject qui prend ChildObject et il ajoute à la liste. Cette méthode est nécessaire pour effectuer une validation de base sur le ChildObject avant de l'ajouter.

Je suis paresseuse dans ce que je ne veux pas déranger et écrire une interface de liste personnalisée (sans méthode add) que les développeurs consommateurs ont besoin de mettre en œuvre. Je suis également en utilisant la méthode ToList () sur l'interface IQueryable donc c'est une autre raison pour coller avec IList -. Il fonctionne

Alors, est-il une approche dans laquelle vous pouvez la police comment les éléments sont ajoutés à l'instance IList à savoir empêcher l'utilisation de la méthode Add et autorise seulement ajouter à la collection via ma méthode personnalisée, ou suis-je simplement demander l'impossible? ... et être paresseux: (

Je peux penser à quelques façons aki dans lequel, à vérifier lorsque des éléments sont ajoutés par ma méthode personnalisée ou directement sur la liste mais ceux-ci semblent hacky!

L'expérience Toute personne quelque chose de semblable à cela? Si oui, qu'avez-vous fait?

Était-ce utile?

La solution

ReadOnlyCollection dans le monde enveloppant votre liste que vous gérer le AUGMENTE.

Autres conseils

Vous pouvez faire votre propriété retourner une enveloppe autour de la liste originale en utilisant ReadOnlyCollection<T> . Cela garantira que les appelants ne correspondent pas tous les éléments eux-mêmes. Vous pouvez conserver une référence à la liste mutable originale. Notez que parce que la collection en lecture seule est un conteneur, les appelants qui en cache la collection en lecture seule ne voient toujours des ajouts que vous apportez à la liste originale. Cela peut ou peut ne pas être une bonne chose en fonction de votre utilisation prévue.

EDIT: Pour expliquer mon commentaire de la mise en cache ...

Supposons qu'un client a fait:

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

avec la propriété Children mis en œuvre comme ceci:

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

Alors originalChildren et updateChildren seraient tous les deux ont le même contenu - le retour ReadOnlyCollection ne serait pas un instantané de la collection des enfants à la première ligne. Il serait tout simplement un wrapper autour de la collection. Les clients ne seraient pas en mesure de compter sur elle ne change pas -. Ils ne seraient pas en mesure de changer eux-mêmes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top