Обычно я стараюсь следовать методологии, чтобы аргументы методов были как можно более универсальными, а типы возвращались настолько универсальными, насколько это необходимо, и столкнулись с проблемой, ответ на которую мне не слишком ясен.
У меня есть элемент управления, который работает со структурой, такой как:
IDictionary<string, IDictionary<string, IEnumerable<MyObject>>>
Так что, предоставляя два ключа, мы получаем коллекцию объектов обратно.Довольно просто.
У меня есть класс
ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
, который является просто словарем только для чтения, так что любые методы IDictionary, которые изменят словарь, выдают NotSupportedException ();
Словарь, в котором работает элемент управления, выходит из MyObjectRepository, который возвращает
ReadOnlyDictionary<string, ReadOnlyDictionary<string, ReadOnlyCollection<MyObject>>>
Поэтому вопрос заключается в том, должен ли я обновить тип возвращаемого значения в моем хранилище, чтобы он возвращал
IDictionary<string, IDictionary<string, IEnumerable<MyObject>>>
или ...?Я не думаю, что было бы правильно обновить метод так, чтобы он брал словарь только для чтения, поскольку это неоправданно ограничивает.
Похоже, это делает его менее понятным в отношении возвращаемого типа.Кроме того, интерфейс определяет ReadOnlyDictionary в качестве возвращаемого типа, так что реализующие классы не могут возвращать словари, которые позволили бы модификацию.Такое ощущение, что если интерфейс возвращает коллекцию, которая должна быть только для чтения, то возвращаемый тип должен это отражать.Указывая общий тип возвращаемого значения IDictionary <...>, методы, которые используют интерфейс, могут пытаться изменить словарь только для запуска в NotSupportedException.
Любые предложения о том, как решить эту проблему, приветствуются!
ОБНОВЛЕНИЕ Как оказалось, настоящая проблема здесь - с коллекцией ReadOnlyCollection.Его просто следует заменить на IEnumerable, и он упрощает большую часть работы по преобразованию между различными типами возвращаемых значений.
См. ReadOnlyCollection или IEnumerable для предоставления коллекций элементов? и обратите внимание на ответ Джона Скита.Вот почему я люблю ТАК:)