Я должен реализовать веб-службу, которая предоставляет список значений (целые числа, настраиваемые классы и т. д.).
Мое рабочее решение возвращает List<T>, и, согласно FxCop, лучше вернуть Collection<T> или ReadOnlyCollection<T>.
Если я решу вернуть ReadOnlyCollection<T>, веб-служба покажет ошибку, например:
To be XML serializable, types which inherit from
ICollectionmust have an implementation ofAdd(System.Int32)at all levels of their inheritance hierarchy.System.Collections.ObjectModel.ReadOnlyCollection1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]does not implementAdd(System.Int32).
Какой ваш любимый способ использовать внутри List<T> и выставить Collection<T>? (с использованием C# и, желательно, только framework 2.0)





В этом случае подойдут List <T> или Collection <T>.
Что касается исходного вопроса, вы можете очень просто обернуть List <T> в Collection <T>:
List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);
Это настоящая обертка; добавьте элемент в оболочку (столбец), и он будет добавлен в список. Это может немного сбивать с толку, потому что многие такие конструкторы используют аргумент для начального заполнения, но не ссылаются на исходный список. Коллекция <T> - исключение ;-p
Поскольку вы находитесь на границе веб-службы, эта рекомендация FxCop не применяется. Это полезно (встроено в Недавний блог Эрика Липперта) для предотвращения того, чтобы вызывающий абонент топчется в памяти вызываемого, но в сценарии распределенной веб-службы, который просто неприменим. Фактически, поскольку у веб-сервисов есть несколько хорошо задокументированных проблем с определенными универсальными сценариями, простой массив, возможно, очень удобен и прагматичен на границе веб-сервиса. В контексте блога Эрика - в этом случае нет вопроса о проблеме вызывающего / вызываемого, поскольку между ними существует принудительный барьер.
Что касается WSDL / mex, я подозреваю, что все 3 (список / коллекция / массив) просто станут блоком элементов - так что вы можете выбрать то, что вам удобнее.
Обычно я возвращаю IList <T> из веб-службы WCF: FxCop это вполне устраивает. Не уверен, работает ли это с веб-сервисами ASMX.
Веб-службы ASMX не будут сериализовать интерфейсы (и будут выдавать исключение во время выполнения).
Спасибо за ваш ответ и за подробности о том, что Collection действует как настоящая оболочка, раньше я ничего об этом не нашел.