Лучший способ использования списка<T> и предоставления доступа к коллекции<T>

StackOverflow https://stackoverflow.com/questions/197521

Вопрос

Я должен реализовать веб-сервис, который предоставляет список значений (целых чисел, пользовательских классов и т.д.).Мое рабочее решение возвращает 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top