4

I have a class with a collection member. I would like to prevent external code from modifying this collection directly, instead using methods (which can perform the appropriate validation etc).

This is harder than I thought. Here is the solution I am using. Can you please tell me if there are better ways to do this common thing? It all just seems a little 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);
    }
  }
Arseny
  • 7,251
  • 4
  • 37
  • 52
David
  • 15,750
  • 22
  • 90
  • 150

2 Answers2

4

I think it's a good solution. This approach is discussed by Martin Fowler here Incapculate collection

Arseny
  • 7,251
  • 4
  • 37
  • 52
2

There's nothing wrong with your approach, but you could alter your Bars-Property to be an IEnumerable if you want, since ReadOnlyCollection implements 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);
    }
}

If you don't use .AsReadOnly() on your List, you could just cast IEnumeable back to List.

sloth
  • 99,095
  • 21
  • 171
  • 219