ふと思い立って、先ほどのHogeDataのジェネリックなListとか返してみたらどうなんだろう、と思い、実験。
サービス側で、以下のようなメソッドを追加
Public Function GetHogeDataList() As System.Collections.Generic.List(Of HogeData) Implements IService1.GetHogeDataList Dim dataList As New List(Of HogeData) dataList.Add(New HogeData With {.HogeID = 10, .HogeName = "HogeHoge"}) dataList.Add(New HogeData With {.HogeID = 20, .HogeName = "HogeHoge2"}) dataList.Add(New HogeData With {.HogeID = 30, .HogeName = "HogeHoge3"}) Return dataList End Function
これでサービス参照を更新すると、Reference.vbが更新されるので、戻り値がどうなるか確認すると、GetHogeDataListの完了イベントハンドラのEventArgsは以下のようになっている。
<System.Diagnostics.DebuggerStepThroughAttribute()> _ Partial Public Class GetHogeDataListCompletedEventArgs Inherits System.ComponentModel.AsyncCompletedEventArgs Private results() As Object Public Sub New(ByVal results() As Object, ByVal exception As System.Exception, ByVal cancelled As Boolean, ByVal userState As Object) MyBase.New(exception, cancelled, userState) Me.results = results End Sub Public ReadOnly Property Result() As ServiceReference1.HogeData() Get MyBase.RaiseExceptionIfNecessary() Return CType(Me.results(0), ServiceReference1.HogeData()) End Get End Property End Class
つまり、ResultはHogeDataの単純な配列で戻る、と。
試しに、silverlight側のハンドラを以下のようにしてみると、うまく取れている(ちゃんと表示される)。
Private Sub OnCompletedDataHogeList(ByVal sender As Object, ByVal e As ServiceReference1.GetHogeDataListCompletedEventArgs) Dim resData As ServiceReference1.HogeData() = e.Result Me.TextBox1.Text = resData(0)._HogeName Me.TextBox2.Text = resData(1)._HogeName End Sub
つか、今の時点でも、それなりに使い物になりそうな予感。