Список <T>только для чтения с приватным набором - PullRequest
50 голосов
/ 20 января 2011

Как я могу выставить List<T> так, чтобы он был доступен только для чтения, но мог быть установлен в частном порядке?

Это не работает:

public List<string> myList {readonly get; private set; }

Даже если вы делаете:

public List<string> myList {get; private set; }

Вы все еще можете сделать это:

myList.Add("TEST"); //This should not be allowed

Я думаю, вы могли бы иметь:

public List<string> myList {get{ return otherList;}}
private List<string> otherList {get;set;}

Ответы [ 15 ]

2 голосов
/ 20 января 2011
private List<string> myList;

public string this[int i]
{
    get { return myList[i]; }
    set { myList[i] = value; }
}
1 голос
/ 20 января 2011

Вы также можете создать свой обычный список, но открыть его через свойство типа IEnumerable

private List<int> _list = new List<int>();

public IEnumerable<int> publicCollection{
   get { return _list; }
}
1 голос
/ 20 января 2011

Почему вы используете список. Похоже, что вы действительно хотите показать это IEnumerable

public IEnumerable<string> myList { get; private set; }

Теперь пользователи класса могут читать предметы, но не изменять список.

0 голосов
/ 03 февраля 2012

Я еще не видел упомянутой опции:

private List<string> myList;

public List<string> MyList
{
    get { return myList.AsReadOnly().ToList(); }
}

Это должно позволить вам открыть список только для чтения.

0 голосов
/ 03 октября 2011

Немного поздно, но тем не менее: мне не нравится использовать оболочку ReadOnlyCollection, потому что она все еще предоставляет все методы для изменения коллекции, которые все выдают NotSupportedException при доступе во время выполнения. Другими словами, он реализует интерфейс IList, но затем нарушает этот же контракт во время выполнения.

Чтобы выразить, что я действительно выставляю неизменный список, я обычно прибегаю к пользовательскому интерфейсу IIndexable, который добавляет Length и индексатор к IEnumerable (описанному в этой статьи CodeProject ). Это обертка, как это и должно было быть сделано в первую очередь ИМХО.

...