Эквивалент геттеров / сеттеров для коллекций в классе - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть следующий класс:

public class Document
{
    public List<DocumentSection> sections = new List<DocumentSection>();
    ...

Различные вопросы касаются ситуации, когда свойство должно быть доступно для записи из класса, но только для чтения извне (/3421529/otkrytaya-peremennaya-c-kak-dostupnaya-dlya-zapisi-vnutri-klassa-no-tolko-dlya-chteniya-vne-klassa)

Я хотел бы сделать то же самое, но для этой коллекции - разрешить добавление в него из класса, но разрешить пользователю проходить через него только тогда, когда они находятся за его пределами. Это элегантно выполнимо?

Спасибо

Ответы [ 5 ]

2 голосов
/ 20 декабря 2011

Представьте коллекцию как IEnumerable, чтобы пользователи могли только просматривать ее.

public class Document {
   private List<DocumentSection> sections;

   public IEnumerable<DocumentSection> Sections 
   { 
       get { return sections; }
   }
}
1 голос
/ 20 декабря 2011

Вы можете открыть список как IEnumerable<DocumentSection> и использовать List только для внутреннего использования.Вот так:

public class Document {
  public IEnumerable<DocumentSection> Sections { get { return list; } }
  private List<DocumentSection> list;
}
1 голос
/ 20 декабря 2011

Да, вам нужно скрыть список и предоставить только метод Add и свойство типа IEnumerable<DocumentSection>:

public class Document
{
    private List<DocumentSection> sections = new List<DocumentSection>();

    public void AddSection(DocumentSection section) {
        sections.Add(section);
    }

    public IEnumerable<DocumentSection> Sections {
        get { return sections; }
    }
}
0 голосов
/ 20 декабря 2011
public class Document {
   private readonly List<DocumentSection> sections = new List<DocumentSection>();

   public IEnumerable<DocumentSection> Sections 
   { 
       get 
       { 
           lock (this.sections)
           {
               return sections.ToList(); 
           }
       }
   }
}
0 голосов
/ 20 декабря 2011

Если вы действительно хотите разрешить только итерацию, вы можете оставить IList закрытым, но сделать публичную функцию, разрешающую GetEnumerator ()

...