Как преобразовать e.Result (возвращенный службой WCF) в список <>? - PullRequest
2 голосов
/ 11 июня 2011

Есть услуга WCF:

    public List<Aktivy> Aktivy()
    {
        DataClassesDataContext db = new DataClassesDataContext();
        var aktivy = from akt in db.Aktivys
                     select aktivy;
        return aktivy.ToList();
    }

Также есть клиент Silverlight, который обращается к службе WCF:

    private void Grid_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        ServiceReference.ServiceClient webService = new ServiceReference.ServiceClient();
        webService.AktivyCompleted += new EventHandler<ServiceReference.AktivyCompletedEventArgs>(webService_AktivyCompleted);
        webService.AktivyAsync();
    }

    void webService_AktivyCompleted(object sender, ServiceReference.AktivyCompletedEventArgs e)
    {            

    }

Как преобразовать e.Result (который имеет webService_AktivyCompleted) в List<Aktivy> на стороне клиента?

Ответы [ 3 ]

4 голосов
/ 11 июня 2011

По умолчанию при настройке ссылки на службу в Silverlight типы коллекций устанавливаются для десериализации в ObservableCollection<T> (что не является List<T>). Если вам всегда нужен простой List<T>, вы можете изменить конфигурацию ссылки на службу (щелкните правой кнопкой мыши службу в обозревателе решений) и установить коллекции, представленные в виде List<T>.

.

Однако лучший подход при работе с этими вещами - это работать с интерфейсами, а не требовать определенного типа. Измените код для работы с IList<T> (ObservableCollection<T> реализует IList<T>) вместо List<T>, это будет работать с любым из возможных типов сбора, для которых может быть настроена служба.

Поскольку ObservableCollection<T> является наиболее универсальным из доступных вариантов, у вас должна быть веская причина, почему коллекция должна быть List<T>. Одной из причин может быть то, что вы делитесь кодом между сервером и клиентом.

3 голосов
/ 11 июня 2011

Как насчет того, чтобы просто привести e.Result к списку?

var listOfAktivy = (List<Aktivy>)e.Result;

В любом случае вы можете просмотреть тип e.Result в окне просмотра / быстрого просмотра.

0 голосов
/ 11 июня 2011

Я думаю, это зависит от того, как вы настроили свой клиент для генерации типов коллекций в справочнике услуг.

По умолчанию клиент будет генерировать простые массивы из определений в wsdl, я считаю, но его можно настроить для генерации списка вместо этого (изменив параметр Тип коллекции на вкладке «Дополнительно» диалогового окна «Добавить ссылку на службу»)в System.Collections.Generic.List).

Каким бы ни был ваш способ, я думаю, что это будет работать (но я не проверял это:

List<Aktivity> listOfAktivy = new List<Aktivy>((IEnumerable<Aktivity>)e.Result);
...