#c# #wcf #generics
#c# #wcf #общие
Вопрос:
У меня есть служба WCF, в которой один из методов (или операционный контракт) использует общий список определенного типа в качестве параметра, однако, когда я пытаюсь использовать эту службу и вызываю этот конкретный метод, я получаю эту ошибку
Cannot convert type 'System.Collections.Generic.List<CA.CCS.sCmd>' to 'CA.CCS.sCmd[]'
Я не знаю, почему ожидается массив объектов вместо общего списка в коде потребителя.
Я хочу отправить этот параметр только как общий список, без каких-либо преобразований на клиенте или сервере, поскольку это снижает производительность службы.
Я нашел похожие вопросы по переполнению стека, но ни один из них не решает мою проблему.
ваш ответ или ссылка на ответ другого пользователя будут высоко оценены.
Обновление: я получаю это окно, когда пытаюсь добавить ссылку на службу, не могу найти здесь никаких настроек
Комментарии:
1. проверьте настройки в вашем прокси-генераторе — может быть, вы решите использовать массив вместо списка / ObservableCollection?
2. @Carsten, я не делал таких настроек. я даже не знаю, как это проверить. Не могли бы вы направить меня, пожалуйста
3. вы можете установить их в диалоговом окне «Добавить ссылку на службу»
4. Обновлен вопрос… пожалуйста, проверьте
5. вы можете задаться вопросом об этом окне ссылки на службу, оно похоже на это, потому что я использую VS2005 (с установленным дополнением) для использования службы WCF
Ответ №1:
Поскольку вы все еще используете VS2005, и ваш прокси-генератор, по-видимому, хочет превратить это в параметр массива, вам просто нужно преобразовать свой List<T>
в T[]
всякий раз, когда вы вызываете этот метод.
Поскольку у вас есть List<T>
экземпляр, вы можете просто использовать его ToArray
метод (поддерживается начиная с .NET 2.0). Поэтому вместо вызова SomeMethod(myList)
вы можете сделать SomeMethod(myList.ToArray())
.
Ответ №2:
Я хочу отправить этот параметр только как общий список, без каких-либо преобразований на клиенте или сервере, поскольку это снижает производительность службы.
Здесь я чего-то не понимаю: вы вызываете службу WCF, поэтому либо вы неправильно используете ее для отправки больших объемов данных, либо проблем с производительностью нет. Кроме того, я думаю, что вы слишком беспокоитесь о производительности здесь. Какую проблему с производительностью вы ожидаете? Даже если у вас очень большой список: если он содержит только ссылочные типы, массив представляет собой просто список меньших указателей. Только если у вас большое количество структур или других типов значений, возникнут проблемы с производительностью, но все же список из 10 000 двойных значений использует только около 80 КБ памяти.
И если вы введете этот код:
List<int> myList = new List<int>();
for (int i = 0; i < 10000; i )
myList.Add(i);
вероятно, вы закодировали большую проблему с производительностью.
Если у вас нет дополнительной информации о том, что может создать проблему, я бы сказал, используйте ToArray()
и готово.
Комментарии:
1. У меня не очень большой список данных, но этот тип данных будет передаваться много раз многими клиентами через Интернет на одном сервере, вот почему я беспокоился, но с помощью вашего объяснения теперь я согласен. Функция toArray(). 🙂 Спасибо
Ответ №3:
информация о конкретном типе коллекции теряется в метаданных при экспорте в wsdl, другими словами, коллекции, отправляемые между сервисом и потребителями, представлены в виде массива. Вы можете посетить эту страницу и перейти к разделу «Настройка типов коллекций», чтобы узнать, как создать пользовательскую коллекцию и предоставить ее в контракте, или посмотреть это руководство