Как переопределить список <T>.IsReadOnly в C # - PullRequest
0 голосов
/ 22 апреля 2009

Я пытаюсь извлечь из List и выборочно включить и выключить свойство IsReadOnly . Я надеялся, что функции Add / Remove / [] сохранят это свойство, но это не так. Как правильно это сделать?

Мой производный класс имеет некоторые дополнительные свойства, поэтому я, к сожалению, не могу просто обернуть список в ReadOnlyCollection.

Ответы [ 3 ]

7 голосов
/ 22 апреля 2009

В этом случае используйте инкапсуляцию вместо наследования.

Вы должны просто заставить свой класс реализовать IList и иметь личную переменную List .

Вы можете проходить через любые функции, которые пожелаете, но также можете полностью переопределить их, изменить поведение и т. Д. Это дает вам полный контроль (за счет наличия множества методов, которые ничего не делают, кроме как вызывают this.List.method (.. .)).

В общем, я не думаю, что в любом случае хорошая идея наследовать от классов коллекции BCL. Я предпочитаю делать их детали реализации внутренними в моем классе.

2 голосов
/ 22 апреля 2009

Список по определению является изменяемым типом. Нет способа сделать его доступным только для чтения.

Если вы создаете производный класс, вам, вероятно, следует реализовать IList напрямую, а не создавать подклассы List в любом случае. Это даст вам полный контроль над реализацией, что позволит вам сделать ее доступной только для чтения, если хотите.

2 голосов
/ 22 апреля 2009

Вы можете вызвать метод "AsReadOnly" в списке, который должен вернуть вам экземпляр IList, который должен учитывать, что он ... err ... только для чтения.

... Хорошо, я только что прочитал ваше последнее предложение, мой плохой. В этом случае, возможно, вы просто захотите реализовать интерфейс IList или любого друга и просто перенаправить большую часть интерфейса в список, который вы храните внутри. Тогда вы можете построить это поведение. Тем не менее, я бы сделал аналогичный шаблон, предоставив некоторый метод «AsReadOnly», который явно дает вам что-то только для чтения.

...