如何将e.Result(由WCF服务返回)转换为List<>?

时间:2011-06-11 09:31:13

标签: .net asp.net silverlight wcf web-services

有一个WCF服务:

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

还有一个访问WCF服务的Silverlight客户端:

    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)
    {            

    }

如何在客户端List<Aktivy>转换e.Result(功能为webService_AktivyCompleted)?

3 个答案:

答案 0 :(得分:4)

默认情况下,在Silverlight中配置服务引用时,集合类型将设置为反序列化为ObservableCollection<T>(不是List<T>)。如果您总是想要一个简单的List<T>,您可以修改服务引用的配置(在解决方案资源管理器中右键显示服务)并将集合设置为List<T>

然而,处理这些事情时更好的方法是使用接口而不是要求特定类型。修改您的代码以使用IList<T>ObservableCollection<T>实现IList<T>)而不是List<T>,这将适用于可以为其配置服务的任何可能的集合类型

由于ObservableCollection<T>是最常用的选项,因此您必须有充分理由将集合设为List<T>。一个原因可能是因为您在服务器和客户端之间共享代码。

答案 1 :(得分:3)

如何将e.Result投射到List?

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

无论如何,您可以在观看/快速观看窗口中查看e.Result的类型。

答案 2 :(得分:0)

我认为这取决于您如何配置客户端以在服务引用中生成集合类型。

默认情况下,客户端将根据我认为的wsdl中的定义生成简单数组,但可以将其配置为生成List(通过将添加服务引用对话框的高级选项卡中的选项Collection类型更改为System)。 Collections.Generic.List)。

你有这样的方式我认为这会有效(但我没有测试过它:

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