2011-06-11 87 views
2

有一個WCF服務:如何將e.Result(由WCF服務返回)轉換爲List <>?

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)轉換客戶端?

回答

4

默認情況下,當配置在Silverlight中的服務引用的集合類型設置爲deserialise到ObservableCollection<T>(這不是一個List<T>)。如果你總是想要一個簡單的List<T>可以修改服務引用的配置(在解決方案資源管理器服務鼠標右鍵),並設置集合被表示爲List<T>

但更好的方法在處理這些事情時是用接口而不是要求特定的類型。修改您的代碼與IList<T>(一個ObservableCollection<T>執行IList<T>)而不是List<T>一起使用,這將適用於服務可能配置的任何可能的集合類型。

由於ObservableCollection<T>是最通用的可用選擇,你必須有一個很好的理由爲什麼收集必須List<T>。一個原因可能是因爲您在服務器和客戶端之間共享代碼。

3

如何將e.Result投射到List?

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

無論如何,您可以在watch/quick watch窗口中查看e.Result的類型。

+0

這可能不適用於所有其他東西都處於默認狀態。 'e.Result'不會是'List '類型。 – AnthonyWJones 2011-06-11 17:14:05

0

我認爲這取決於你如何配置你的客戶端來生成服務引用中的集合類型。

默認情況下,客戶端將根據wsdl中的定義生成簡單數組,我相信,但可以將其配置爲生成List(通過將添加服務引用對話框的高級選項卡中的Collection類型更改爲System .Collections.Generic.List)。

永遠這樣,你有它,我認爲這會工作(但我沒有測試它:

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

該代碼效率不高,您要求代碼複製整個結果。如您所述,更好地配置服務參考。 – AnthonyWJones 2011-06-11 17:19:55

+0

@Anthony,我完全同意。這真的是對@Kamarey答案的迴應,如果結果不是列表類型,那麼這將不起作用。我會編輯以更清楚地說明。 – 2011-06-11 17:43:46

相關問題