我有一个类orderItem,它是产品和服务类的父类,我在列表集合中添加产品或服务。如何转换服务或产品以检索订单项目?
Public MustInherit Class OrderItem
Private m_enuItemType As TypeOfItem = TypeOfItem.None
Private m_strUserID As String = ""
Public Sub New(ByVal enuItemType As TypeOfItem)
m_enuItemType = enuItemType
End Sub
Public Enum TypeOfItem
None = 0
Product = 1
Service = 2
End Enum
Public Property ItemType() As TypeOfItem
Get
Return m_enuItemType
End Get
Set(ByVal value As TypeOfItem)
m_enuItemType = value
End Set
End Property
Public Property UserID() As String
Get
Return m_strUserID
End Get
Set(ByVal value As String)
m_strUserID = value
End Set
End Property
End Class
Public Class Service
Inherits OrderItem
'service Booking Business object
Private objServiceBooking As Bo_Dall_Layer.ServiceBooking
Public Sub New(ByVal enuItemType As TypeOfItem)
MyBase.New(enuItemType)
End Sub
Public Property CartService() As Bo_Dall_Layer.ServiceBooking
Get
Return objServiceBooking
End Get
Set(ByVal value As Bo_Dall_Layer.ServiceBooking)
objServiceBooking = value
End Set
End Property
End Class
Public Class Product
Inherits OrderItem
'product Business object
Private objProduct As Bo_Dall_Layer.BoProduct
Public Sub New(ByVal enuItemType As TypeOfItem)
MyBase.New(enuItemType)
End Sub
Public Property Boprd() As Bo_Dall_Layer.BoProduct
Get
Return objProduct
End Get
Set(ByVal value As Bo_Dall_Layer.BoProduct)
objProduct = value
End Set
End Property
End Class
Public Class CartItem
Private m_enuItemType As ItemType
Private m_objOrderItem As OrderItem
Private Enum ItemType
Product = 1
Service = 2
End Enum
Public Property Item(ByVal objItem As OrderItem) As OrderItem
Get
Return m_objOrderItem
End Get
Set(ByVal value As OrderItem)
m_objOrderItem = value
End Set
End Property
End Class
Public Class UserShoppingCart
Private m_objArrListOfItems As List(Of OrderItem)
Public Sub New()
m_objArrListOfItems = New List(Of OrderItem)(10)
End Sub
Public Function AddItem(ByVal objOrderItem As OrderItem) As Boolean
Try
' Validate item to check if it is already in the list
' If yes, increment counter, otherwise add new item to the list
m_objArrListOfItems.Add(objOrderItem)
Catch ex As Exception
' Log error
End Try
End Function
Public ReadOnly Property ListOfItems() As List(Of OrderItem)
Get
Return m_objArrListOfItems
End Get
End Property
End Class
我使用这段代码来检索列表集合中的数据。我要找出这个错误
System.InvalidCastException:无法将“CartProduct”类型的对象强制转换为“CartService”类型。在Cart.Page_Load( F:\pic\Eshop\MirraNew\Cart.aspx.vb:line 30中的对象发送方,EventArgs e)
Dim arr As New ArrayList
Dim arrService As New ArrayList
Dim objlist As CartProduct
Dim objServiceList As CartService
For Each OrderItem As CartProduct In g_objUserShoppingCart.ListOfItems
objlist = New CartProduct(Global.OrderItem.TypeOfItem.Product)
objlist.ProductId = OrderItem.ProductId
arr.Add(objlist)
Next
'---------------------------------------------------
For Each OrderItem As CartService In g_objUserShoppingCart.ListOfItems
objServiceList = New CartService(Global.OrderItem.TypeOfItem.Service)
objServiceList.ServiceName = OrderItem.ServiceName
arrService.Add(objServiceList)
Next
If Not IsPostBack Then
ProductCartView.DataSource = arr
ProductCartView.DataBind()
ServiceCartView.DataSource = arrService
ServiceCartView.DataBind()
End If
发布于 2011-07-27 13:02:13
您的问题是变量名称的重用。您在这里对两种不同的类型使用相同的变量名OrderItem
。尽管在您的脑海中,变量的作用域是该块,但是通过给它分配一个类型,您已经将它固定在方法级别上。
For Each OrderItem As CartProduct In g_objUserShoppingCart.ListOfItems
objlist = New CartProduct(Global.OrderItem.TypeOfItem.Product)
objlist.ProductId = OrderItem.ProductId
arr.Add(objlist)
Next
For Each OrderItem As CartService In g_objUserShoppingCart.ListOfItems
objServiceList = New CartService(Global.OrderItem.TypeOfItem.Service)
objServiceList.ServiceName = OrderItem.ServiceName
arrService.Add(objServiceList)
Next
有两种解决方案,要么删除类型声明(在较早版本的VB中可能不起作用),要么只是重命名循环变量。
1)
For Each OrderItem In g_objUserShoppingCart.ListOfItems
objlist = New CartProduct(Global.OrderItem.TypeOfItem.Product)
objlist.ProductId = OrderItem.ProductId
arr.Add(objlist)
Next
For Each OrderItem In g_objUserShoppingCart.ListOfItems
objServiceList = New CartService(Global.OrderItem.TypeOfItem.Service)
objServiceList.ServiceName = OrderItem.ServiceName
arrService.Add(objServiceList)
Next
2)
For Each pOrderItem As CartProduct In g_objUserShoppingCart.ListOfItems
objlist = New CartProduct(Global.OrderItem.TypeOfItem.Product)
objlist.ProductId = pOrderItem.ProductId
arr.Add(objlist)
Next
For Each sOrderItem As CartService In g_objUserShoppingCart.ListOfItems
objServiceList = New CartService(Global.OrderItem.TypeOfItem.Service)
objServiceList.ServiceName = sOrderItem.ServiceName
arrService.Add(objServiceList)
Next
下面是一个关于您的问题的更通用的示例。这将编译,但失败与相同的基本错误。
Dim Ints As New List(Of Integer)
Dim Strings As New List(Of String)
Ints.Add(1)
Strings.Add("Bob")
For Each V As Integer In Strings
Trace.WriteLine(V)
Next
For Each V As String In Ints
Trace.WriteLine(V)
Next
此外,当您在其中时,更改子类的定义,调用者甚至不需要知道枚举:
Public Class Product
Inherits OrderItem
Public Sub New()
MyBase.New(Global.OrderItem.TypeOfItem.Product)
End Sub
End Class
https://stackoverflow.com/questions/6844275
复制相似问题