2

WCF サービスを作成し、Contact と Driver という 2 つの特定のオブジェクトを用意しました。Driver は Contact を継承します。Contact オブジェクトは、より大きな Member オブジェクトの一部です。コードには次のものがあります。

<DataContract()>
Public Class Contact
    <DataMember()>
    Public Name As String
    <DataMember()>
    Public HomePhone As String
    ... etc.
End Class

<DataContract()>
Public Class Driver
    Inherits Contact
    <DataMember()>
    Public LicenseNum As String
    <DataMember()>
    Public LicenseState As String
    ... etc.
End Class

<DataContract(), KnownType(GetType(Driver))>
Public Class Member
    <DataMember()>
    Public Info As Contact
    <DataMember()>
    Public PrimaryStore As Store
    ... etc.
End Class

datacontract 行に knowntype があるため、Info プロパティを持つ Member オブジェクトを Contact ではなく Driver として作成し、ライセンス情報を保存できます。

私の問題は、返されたデータを確認するためにテスト プロジェクトを作成するときに、Info プロパティを呼び出したときにライセンス情報を取得できないことです。

Dim svc as New Service.RetrieveService
Dim sMember as Member
Dim memNum as String = "ABC123"
sMember = svc.GetMember(memNum)
Console.WriteLine("LicenseNumber" & sMember.Info...PROBLEM!!!)

sMember.Info は、Contact に属するプロパティ (Name、HomePhone など) のみを提供し、Driver に属するプロパティ (LicenseNum、LicenseState など) は提供しません。この情報にアクセスするにはどうすればよいですか?

以下のように、ServiceKnownType を OperationContract に追加しようとしました。

<ServiceContract()>
Public Interface RetrieveMember
    <OperationContract(), ServiceKnownType(GetType(Driver))>
    Function GetMember(ByVal memberNumber as String) As Member
End Interface

しかし、それは役に立ちませんでした。

4

1 に答える 1

1

これは、Member.Infoプロパティが型として定義されているためContactです。つまり、Driverオブジェクトを参照している場合でも、オブジェクトとしてキャストされるContactため、それらの基本メンバーのみが表示されます。これは、WCF とは関係のない問題です。たとえば、状況から WCF を削除しても、同じ問題が発生します。

Dim m As New Member()
m.Info = New Driver()
Console.WriteLine(m.Contact.LicenseNum)  ' Won't compile!

したがって、Infoプロパティがオブジェクトを参照している場合は、メンバーDriverにアクセスする前にその型にキャストする必要があります。Driver

Dim m As Member
' ...
If TypeOf m.Info Is Driver Then
    Dim d As Driver = CType(m.Info, Driver)
    Console.WriteLine(d.LicenseNum)  ' Works fine
End if
于 2013-02-14T16:43:15.223 に答える