我正在向现有的VB .Net应用程序添加一项功能,该功能涉及从.Net Web服务检索数据。 Web服务返回一组位置。位置非常简单,它有3个属性 - 一个整数和两个字符串。
因此我的应用程序的其余部分不必依赖于此Web服务,我想在我的应用程序中创建自己的Location类型。我的想法是我可以调用一个方法来返回我的Location类型的通用列表,它在内部调用Web服务并填充我返回的列表。这样,如果Locations的数据源在将来更改为Web服务以外的其他内容,我只需修复该方法而不是修复所有调用方。
所以我创建了自己的Location,它具有与服务Location相同的属性。但我似乎无法将服务位置数组转换为我的位置的通用列表。我也尝试将一个服务位置投射到我的一个位置,但也没有用。
那么是否正在构建一个选项,或者我是否必须遍历每个服务位置并将每个属性分配给我的新位置?或者有一种完全不同的方式来解决这个问题吗?
答案 0 :(得分:2)
转换不起作用,因为它们不是同一类型。即使两种类型看起来完全相同,也不能从一种类型转换为另一种类型,除非您定义了一个CType运算符,该运算符描述了如何将对象从一种类型转换为另一种类型的对象。 即便如此,您也无法直接将List(Type1)转换为List(Of Type2)。
您必须循环并创建班级的新对象。
答案 1 :(得分: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 Location和Application Location之间执行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