1

我有以下层次结构(为简洁起见,我不在这里写构造函数和类似的项目):

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
4

2 回答 2

0

(上面复制答案)。

看来我有个主意了。泛型在这里会有所帮助:

Sub FillDGV(Of T As IData)(ByVal lst as List(Of T))
   someDataGridView.DataSource = a
End Sub
于 2013-06-18T00:02:21.793 回答
0

您需要为每种类型提供一个 FillDGV 子程序,或者一个涵盖所有实现该接口的类型的通用子程序。如果您对每种类型都做同样的事情(即,只是将其绑定到网格),那么您可以采用通用路线。如果你想对每种类型做一些特定的事情,那么你需要像这样重载 FillDGV 子:

Sub FillDGV(ByVal lst as List(Of Data1))
   If Not lst.Any Then Return
   For each item In lst
      Console.WriteLine(item.CoolProperty1.ToString())
   Next item
   someDataGridView.DataSource = lst
End Sub

Sub FillDGV(ByVal lst as List(Of Data2))
   If Not lst.Any Then Return
   For each item In lst
      Console.WriteLine(item.CoolProperty2.ToString())
   Next item
   someDataGridView.DataSource = lst
End Sub
于 2013-06-17T13:35:45.097 回答