Лучший способ использования списка<T> и предоставления доступа к коллекции<T>
-
10-07-2019 - |
Вопрос
Я должен реализовать веб-сервис, который предоставляет список значений (целых чисел, пользовательских классов и т.д.).Мое рабочее решение возвращает List<T>
, и , согласно FxCop , лучше вернуть Collection<T>
или ReadOnlyCollection<T>
.
Если я решу вернуть ReadOnlyCollection<T>
, веб - служба показывает ошибку типа:
Чтобы быть XML-сериализуемыми, типы, которые наследуются от
ICollection
должна иметь реализациюAdd(System.Int32)
на всех уровнях их иерархии наследования.System.Collections.ObjectModel.ReadOnlyCollection
1
[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
не реализуетAdd(System.Int32)
.
Какой ваш любимый способ внутреннего использования List<T>
и выставлять напоказ Collection<T>
?(используя C # и предпочтительно только framework 2.0)
Решение
Список<T> или Collection<T> в этом случае все в порядке.
Что касается исходного вопроса, вы можете обернуть список<T> в коллекцию<T> очень просто:
List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);
Это настоящая обертка;добавьте элемент в оболочку (col), и он будет добавлен в список.Это может немного сбить с толку, потому что многие такие конструкторы используют аргумент для выполнения начальной совокупности, но не ссылаются на исходный список.Коллекция<T> является исключением;-p
Поскольку вы находитесь на границе веб-сервиса, эта рекомендация от FxCop неприменима.Это полезно (встроено в Недавний блог Эрика Липперта), чтобы предотвратить доступ вызывающего абонента к памяти вызываемого абонента - но в распределенном сценарии веб-сервиса это просто неприменимо.Фактически, поскольку веб-сервисы имеют несколько хорошо документированных проблем с определенными общими сценариями, простой массив, возможно, очень удобен и прагматичен на границе веб-сервиса.В контексте блога Эрика - в данном случае нет вопроса о проблеме вызывающего абонента, поскольку между ними существует принудительный барьер.
С точки зрения WSDL / mex, я подозреваю, что все 3 (список / коллекция / массив) просто станут блоком элементов - так что вы можете выбрать тот, который наиболее удобен.
Другие советы
Обычно я возвращаю IList < T > из веб-службы WCF: FxCop достаточно доволен этим. Не уверен, что это работает с веб-сервисами ASMX.