首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在列表集合中检索对象的收集

在列表集合中检索对象的收集
EN

Stack Overflow用户
提问于 2011-07-27 12:27:44
回答 1查看 90关注 0票数 0

我有一个类orderItem,它是产品和服务类的父类,我在列表集合中添加产品或服务。如何转换服务或产品以检索订单项目?

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2011-07-27 13:02:13

您的问题是变量名称的重用。您在这里对两种不同的类型使用相同的变量名OrderItem。尽管在您的脑海中,变量的作用域是该块,但是通过给它分配一个类型,您已经将它固定在方法级别上。

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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

下面是一个关于您的问题的更通用的示例。这将编译,但失败与相同的基本错误。

代码语言:javascript
运行
复制
    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

此外,当您在其中时,更改子类的定义,调用者甚至不需要知道枚举:

代码语言:javascript
运行
复制
Public Class Product
    Inherits OrderItem

    Public Sub New()
        MyBase.New(Global.OrderItem.TypeOfItem.Product)
    End Sub

End Class
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6844275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档