VB.NET List(Of T) - 我可以用它来保存几种类型的项目吗?

时间:2009-10-03 04:47:57

标签: vb.net generics

假设基本类型为“消息”......

Public Class Message
   Public ID As Int64
   Public Text As String
   Public MessageType as String
End Class

...然后是两个派生类......

Public Class PhoneMessage
   Inherits Message
   Public MessageLength As Int64
End Class

Public Class MailMessage
   Inherits Message
   Public Postage As Int64
End Class

我想拥有一个Message对象集合,可以是PhoneMessages或MailMessages,这样我就可以遍历列表并根据它发生的类型来处理每个消息。

尝试使用.Add()失败,说我无法将类型为PhoneMessage的项添加到List(Of Message)。是否有一些优雅的方式来完成我想要做的事情?我以为我可以通过泛型完成这个,但我认为我的理解存在差距。如果它可以在.NET 2.0中完成,那将是理想的。

提前谢谢。

4 个答案:

答案 0 :(得分:2)

您描述如何将项目添加到列表的方式应该有效。也许您的代码中缺少某些内容?使用您为类提供的代码,这应该可以解决问题:

    Dim phoneMessage As New PhoneMessage()
    Dim mailMessage As New MailMessage()

    Dim messageList As New List(Of Message)()

    messageList.Add(phoneMessage)
    messageList.Add(mailMessage)

答案 1 :(得分:1)

您只需要将PhoneMessage强制转换为其基类Message

答案 2 :(得分:0)

奇怪,这确实应该奏效。您是否尝试过使用CType()或DirectCast将其强制转换为消息?

答案 3 :(得分:0)

以下是一些证明scottman666正确无误的代码:

Public Class InheritanceTest
    Public Class Message
        Public ID As Int64
        Public Text As String
        Public MessageType As String
    End Class

    Public Class PhoneMessage
        Inherits Message
        Public MessageLength As Int64

    End Class

    Public Class MailMessage
        Inherits Message
        Public Postage As Int64
    End Class

    Public Shared Sub ListTest()
        Dim lst As New List(Of Message)
        Dim msg As Message

        msg = New PhoneMessage()

        lst.Add(msg)
        lst.Add(New MailMessage())
    End Sub
End Class

我建议你考虑使用Overidable和MustOveride函数来制作多态对象。有一种很好的方法可以处理您使用的设计模式。