在通用方法中转换为泛型类型

时间:2013-12-04 19:13:37

标签: .net vb.net generics

我试图编写一个方法来返回所有特定类型控件的列表:

所以我有类似下面的方法:

Private Function GetAllChildControls(Of T)(ByVal grid As DataGridItemCollection) 
                                           As List(Of T)
    Dim childControls As New List(Of T)
    For Each item As DataGridItem In grid 
        For Each tableCell As TableCell In item.Cells
            If tableCell.HasControls Then
                For Each tableCellControl As Control In tableCell.Controls
                    If tableCellControl.GetType Is GetType(T) Then

                        childControls.Add(DirectCast(tableCellControl, T))

                    End If
                Next
            End If
        Next
    Next
    Return childControls
End Function

但是在以下代码中失败了:

childControls.Add(DirectCast(tableCellControl, T))

我收到消息:

  

无法将System.Web.UI.Control类型的表达式转换为T类型。

如何返回特定类型的列表?

1 个答案:

答案 0 :(得分:1)

泛型可以是 任何 ,因此编译器无法知道您只打算在继承自System.Web.UI.Control的类型上调用此方法。实际上,您可以使用类型Integer调用该函数,在这种情况下,转换将失败。

您需要做的是说服编译器您只能使用Generic Constraints传递某些类型。然后,您只能允许适用的类型调用该方法。

您需要做的就是修改您的签名:

Private Function GetAllChildControlsInDataGrid(Of T As Control)(
                      ByVal grid As DataGridItemCollection) As List(Of T)