我有以下层次结构(为简洁起见,我不在这里写构造函数和类似的项目):
Interface IData
ReadOnly Property ID As Integer
ReadOnly Property Name As String
End Interface
Public Class Data1
Implements IData
ReadOnly Property CoolProperty1 As String
End Class
Public Class Data2
Implements IData
ReadOnly Property CoolProperty2 As String
End Class
现在,WinForms 应用程序中的代码是:
Dim a As List(Of IData) = {New Data1(1, "Name1", "Cool1_1"),
New Data1(1, "Name2", "Cool1_2")}.ToList();
someDataGridView.DataSource = a
当我这样做时,我只有列 ID 和名称。为了查看 CoolProperty1 列,我必须进行显式转换:
Sub FillDGV(ByVal lst as List(Of IData)
someDataGridView.DataSource = a.Cast(Of Data1).ToList()
End Sub
如果我考虑到 Data2 类,则上面的 Sub 变为:
Sub FillDGV(ByVal lst as List(Of IData)
If Not lst.Any Then Return
If TypeOf lst.First Is Data1 Then
someDataGridView.DataSource = lst.Cast(Of Data1).ToList()
ElseIf TypeOf lst.First Is Data2 Then
someDataGridView.DataSource = lst.Cast(Of Data2).ToList()
Else
someDataGridView.DataSource = lst
EndIf
End Sub
我确实理解为什么编译器会这样做,但我想知道是否有任何好的模式可以让我避免这种强制转换。
更新:问题是我的 FillDGV 函数总是接收列表,其中包含相同类型的项目,它是 List(Of Data1) 或 List(Of Data2)。
解决方案: 看来我有一个想法。泛型在这里会有所帮助:
Sub FillDGV(Of T As IData)(ByVal lst as List(Of T))
someDataGridView.DataSource = lst
End Sub