我创建了一个WCF服务,并有两个特定的对象,Contact和Driver。驱动程序继承联系人。 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行上有知识类型,所以我可以使用Info属性创建一个Member对象作为Driver而不是Contact,这样我就可以保存他们的许可证信息。
我的问题是,当我创建一个测试项目来查看返回的数据时,我在调用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仅向我提供属于联系人(姓名,HomePhone等)的属性,且不属于Driver(LicenseNum,LicenseState等)。如何访问此信息?
我已经尝试将ServiceKnownType添加到我的OperationContract中,如下所示:
<ServiceContract()>
Public Interface RetrieveMember
<OperationContract(), ServiceKnownType(GetType(Driver))>
Function GetMember(ByVal memberNumber as String) As Member
End Interface
但它没有帮助。
答案 0 :(得分: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