如何处理不同泛型类型的列表?

时间:2015-10-04 19:41:28

标签: vb.net list types type-conversion

我写了以下代码:

Public Class FrmMain
    Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '''''''''BioSystem Section'''''''''
        Dim Bio As New BioSystem
        Dim LstBioSystem As New List(Of BioSystem)

        Bio.Heart = "Some Value"
        Bio.liver = "Some Value"
        Bio.Lungs = "Some Value"
        LstBioSystem.Add(Bio)
        '''''Add Second Value to BioSystem list
        Bio = New BioSystem
        Bio.Heart = "Some Value2"
        Bio.liver = "Some Value2"
        Bio.Lungs = "Some Value2"
        LstBioSystem.Add(Bio)

        '''''''''Car Section'''''''''
        Dim Car As New CarSystem
        Dim LstCars As New List(Of CarSystem)

        Car.Acceleration = "Some Value"
        Car.Engine = "Some Value"
        Car.Speed = "Some Value"
        Car.Weight = "Some Value"
        LstCars.Add(Car)
        '''''Add Second Value to Car list
        Car = New CarSystem
        Car.Acceleration = "Some Value2"
        Car.Engine = "Some Value"
        Car.Speed = "Some Value2"
        Car.Weight = "Some Value2"
        LstCars.Add(Car)

        ''''Output values
        WriteBio(LstBioSystem)
        WriteCar(LstCars)
    End Sub

    Public Sub WriteBio(ByVal BioList As List(Of BioSystem))
        For Each Bio As BioSystem In BioList
            Console.WriteLine($"Heart:{Bio.Heart}, liver:{Bio.liver}, Lungs:{Bio.Lungs}")
        Next
    End Sub

    Public Sub WriteCar(ByVal CarList As List(Of CarSystem))
            For Each Car As CarSystem In CarList
                Console.WriteLine($"Acceleration:{Car.Acceleration}, Engine:{Car.Engine}, Speed:{Car.Speed}, Weight:{Car.Weight}")
            Next
    End Sub
End Class

Public Class BioSystem
    Public Property Heart As String
    Public Property liver As String
    Public Property Lungs As String
End Class

Public Class CarSystem
    Public Property Engine As String
    Public Property Speed As String
    Public Property Acceleration As String
    Public Property Weight As String
End Class

我想知道是否有办法简化代码?

做这样的事情:

*方法“WriteStr”应该替换“WriteBio”方法和“WirteCar”方法。

'using:

  WriteStr(LstBioSystem)
  WriteStr(LstCars)

''''
      Public Sub WriteStr(Of T)(ByVal Lst As List(Of T))
            Select Case GetType(T)
                Case GetType(BioSystem)
                    For Each Bio As BioSystem In Lst
                        Console.WriteLine($"Heart: {Bio.Heart}, liver:{Bio.liver}, Lungs:{Bio.Lungs}")
                Next
            Case GetType(CarSystem)
                For Each Car As CarSystem In Lst
                    Console.WriteLine($"Acceleration:{Car.Acceleration}, Engine:{Car.Engine}, Speed:{Car.Speed}, Weight:{Car.Weight}")
                Next
        End Select
    End Sub

当然,我有错误;

  

“'T'类型的值无法转换为'BioSystem'”

     

“类型'T'的值无法转换为'CarSystem'”

1 个答案:

答案 0 :(得分:0)

您应该覆盖您的类自动从ToString

继承的Object方法
Public Class BioSystem
    Public Property Heart As String
    Public Property Liver As String
    Public Property Lungs As String

    Public Overrides Function ToString() As String
        Return $"Heart: {Heart}, Liver: {Liver}, Lungs: {Lungs}"
    End Function
End Class

Public Class CarSystem
    Public Property Engine As String
    Public Property Speed As String
    Public Property Acceleration As String
    Public Property Weight As String

    Public Overrides Function ToString() As String
        Return $"Acceleration: {Acceleration}, Engine: {Engine}, Speed: {Speed}, Weight: {Weight}"
    End Function
End Class

使用这些声明,您只需写下:

Console.WriteLine(bio)

Console.WriteLine(car)

您可以编写适用于任何类型列表的方法

Public Sub WriteList(Of T)(list As List(Of T))
    For Each item As T In list
        Console.WriteLine(item)
    Next
End Sub

您可以使用对象和集合初始值设定项简化对象和列表创建。

Dim bioSystems = new List(Of BioSystem) From {
    New BioSystem() With { .Heart =  "heart 1", .Liver =  "liver 1", .Lungs = "lung 1" },
    New BioSystem() With { .Heart =  "heart 2", .Liver =  "liver 2", .Lungs = "lung 2" }
}
WriteList(bioSystems)

输出:

  

心脏:心脏1,肝脏:肝脏1,肺脏:肺1   心脏:心脏2,肝脏:肝脏2,肺脏:肺2

请参阅:https://dotnetfiddle.net/YkE9Nz

结论Select Case - 语句通常强烈暗示事情不是以最佳的面向对象方式完成的。让对象做自己的事情,而不是在这些对象之外的select-case语句中做这些事情。在上面的示例中,每个对象都负责创建自己的字符串表示。

查看
- Inheritance and Polymorphism in VB.NET
- Replace Conditional with Polymorphism(C#但很好的解释)