Шаблон для принудительного добавления в коллекцию через метод в C # - PullRequest
4 голосов
/ 28 июля 2010

У меня есть класс с членом коллекции.Я хотел бы запретить внешнему коду изменять эту коллекцию напрямую, вместо этого используя методы (которые могут выполнять соответствующую проверку и т. Д.).

Это сложнее, чем я думал.Вот решение, которое я использую.Можете ли вы сказать мне, если есть лучшие способы сделать это обычное дело?Кажется, что все это немного переоценено.

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);
    }
  }

Ответы [ 2 ]

4 голосов
/ 28 июля 2010

Я думаю, что это хорошее решение. Этот подход обсуждается Мартином Фаулером здесь Инкапсулированная коллекция

2 голосов
/ 28 июля 2010

В вашем подходе нет ничего плохого, но вы можете изменить свойство Bars на IEnumerable, если хотите, так как ReadOnlyCollection реализует 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);
    }
}

Если вы не используете .AsReadOnly () в своем списке, вы можете просто привести IEnumeable обратно к списку.

...