2010-07-28 15 views
4

J'ai une classe avec un membre de collection. Je voudrais empêcher le code externe de modifier directement cette collection, en utilisant des méthodes (qui peuvent effectuer la validation appropriée, etc.).Motif pour forcer l'ajout à la collection via la méthode en C#

C'est plus difficile que je ne le pensais. Voici la solution que j'utilise. Pouvez-vous s'il vous plaît me dire s'il y a de meilleures façons de faire cette chose commune? Tout semble juste un peu overengineered.

using System.Collections.Generic; 
using System.Collections.ObjectModel; 
public class Foo 
    { 
    private List<Bar> _bars = new List<Bar>(); 

    public ReadOnlyCollection<Bar> Bars { get { return _bars.AsReadOnly(); } } 

    public void AddBar(Bar bar) //black sheep 
    { 
     //Insert validation logic here 
     _bars.Add(bar); 
    } 
    } 

Répondre

4

Je pense que c'est une bonne solution. Cette approche est discutée par Martin Fowler ici Incapculate collection

+1

Très bien. Je ne suis pas du genre à discuter avec notre Martin. – David

2

Il n'y a rien de mal à votre approche, mais vous pouvez modifier votre Bars-Propriété pour être un IEnumerable si vous voulez, puisque ReadOnlyCollection implémente IEnumerable.

public class Foo 
{ 
    private List<Bar> _bars = new List<Bar>(); 

    public IEnumerable<Bar> Bars { get { return _bars.AsReadOnly(); } } 

    public void AddBar(Bar bar) //black sheep 
    { 
     //Insert validation logic here 
     _bars.Add(bar); 
    } 
} 

Si vous n'utilisez pas .AsReadOnly() sur votre liste, vous pouvez simplement jeter à la liste IEnumeable retour.

+0

Bon endroit, merci. – David