2009-03-29 15 views
1

.NET Webサービスからデータを取得する機能を既存のVB .NETアプリケーションに追加しています。 WebサービスはLocationsの配列を返します。 Locationはとてもシンプルで、整数と2つの文字列の3つのプロパティがあります。VB .NETでの型キャスト

残りのアプリケーションはこのWebサービスに依存する必要はないので、自分のアプリケーション内に独自のLocationタイプを作成したいと思います。私の考えは、内部的にWebサービスを呼び出し、返すリストに値を設定するLocationタイプの汎用リストを返すメソッドを呼び出すことができるということです。そうすれば、LocationsのデータソースがWebサービス以外のものに変更された場合、すべての呼び出し元を修正するのではなく、このメソッドを修正するだけで済みます。

サービスロケーションと同じプロパティを持つ独自のロケーションを作成しました。しかし、私はサービスの場所の配列を私の場所の一般的なリストにキャストできないようです。私はまた、私の場所の一つに単一のサービスロケーションをキャストしようとしましたが、どちらもうまくいきませんでした。

オプションをキャストするか、各サービスの場所をループして各プロパティを自分の場所の新しい場所に割り当てる必要がありますか?それとも、これとは全く別の方法がありますか?

答えて

2

デフォルトでは、ある場所を別の場所にキャストすることはできません。彼らは完全に無関係のタイプなので、キャストの対象にすることはできません。 CTypeのアプリケーションバージョン用のカスタム演算子を定義することによって、キャストすることが可能になります。

' Location for application 
Public Class Location 
    ... 
    Public Shared Operator Widening CType(p1 as Namespace.Of.WebService.Location) As Location 
    Dim loc = ConvertWebServiceLocationToApplicationLocation 
    return loc 
    End Operator 
End Class 

これで、WebServiceの場所とアプリケーションの場所の間でCType操作を実行できるようになりました。

アレイをキャストすることはできません。配列の変換演算子を定義する方法はないので、上記のトリックを使用することはできません。しかし、この目的のためにすばやく汚れた関数を書くことができます

Public Shared Function ConvertArray(ByVal arr As Namespace.Of.WebServiec.Location()) As Location() 
    Dim newArray(arr.Length) As Location 
    For i as Integer = 0 To arr.Length - 1 
    newArray(i) = CType(arr(i), Location) 
    Next 
    return newArray 
End Function 
2

これらは同じタイプではないため、キャストは機能しません。たとえ2つの型が全く同じに見えても、オブジェクトをある型から別の型のオブジェクトに変換する方法を記述したCType演算子を定義しない限り、一方から他方へキャストできません。 それでもリスト(Type1の)を直接List2(Of Type2)にキャストすることはできません。

クラスの新しいオブジェクトをループして作成する必要があります。