【问题标题】:How to convert e.Result (that returned by WCF service) to the List <>?如何将 e.Result(由 WCF 服务返回)转换为 List <>?
【发布时间】:2011-06-11 09:31:13
【问题描述】:

有一个 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)
    {            

    }

如何在客户端转换List&lt;Aktivy&gt;中的e.Result(其中包含webService_AktivyCompleted)?

【问题讨论】:

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


    【解决方案1】:

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

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

    由于ObservableCollection&lt;T&gt; 是可用选项中最通用的选项,您必须有充分的理由说明集合必须List&lt;T&gt;。一个原因可能是因为您在服务器和客户端之间共享代码。

    【讨论】:

      【解决方案2】:

      将 e.Result 转换为 List 怎么样?

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

      无论如何你都可以在watch/quick watch窗口中查看e.Result的类型。

      【讨论】:

      • 这可能不适用于所有其他默认设置。 e.Result 将不是 List&lt;T&gt; 类型。
      【解决方案3】:

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

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

      无论你有哪种方式,我认为这会起作用(但我还没有测试过:

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

      【讨论】:

      • 该代码效率不高,您要求代码复制整个结果。如您所说,正确配置服务引用要好得多。
      • @Anthony,我完全同意。这实际上是对@Kamarey 答案的回应,如果结果还不是列表类型,则该答案将不起作用。我将进行编辑以使其更清楚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多