2013-02-14 39 views
2

我创建了一个WCF服务并且有两个特定的对象Contact和Driver。驱动程序继承联系人。 Contact对象是较大成员对象的一部分。在代码中,我有以下几点:WCF服务已知类型的对象将不会返回已知类型的属性

<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属性时,我无法获取许可证信息。

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等),并没有属于驱动程序(LicenseNum,LicenseState等)?

我已经尝试ServiceKnownType添加到我的OperationContract的,如下:

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

,但它并没有帮助。

回答

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 
+0

工作正常!我只是想知道是否有一些新的方法,因为它是一个被调用的WCF服务。让我想知道调用你的服务的人会如何知道这些特定的项目与服务节目不同。 – 2013-02-14 19:22:30