【问题标题】:Cast to Generic Type in Generic Method在泛型方法中转换为泛型类型
【发布时间】:2013-12-04 19:13:36
【问题描述】:

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

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

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 类型。

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

【问题讨论】:

  • 神秘的反对者?有什么原因吗?
  • 不是我,但可能是由于大量嵌套。这被一些人认为是不好的做法,随着代码量的增加几乎不可能维护。
  • @Neolisk,感谢您尝试解释。如果你能弄清楚如何对那个怪物进行 LINQify,我会全力以赴,但我尝试编写一些 linq 查询,但它们似乎不太可读。这个函数的重点是将我需要做的嵌套包装到一个我可以调用的方法中。我真的不认为这是一个糟糕的做法。无论如何,这不是我问题的核心组成部分。
  • LINQ 在可维护性方面很糟糕。我更喜欢简单的旧学校代码,即使您将拥有更多代码。我快速尝试改进代码布局和可读性:pastebin。实际上,即使是this - pastebin #2
  • 很高兴我让您对此感到兴奋。我喜欢在工作和业余时间进行代码优化。做得好! +1。

标签: .net vb.net generics


【解决方案1】:

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

您需要做的是让编译器相信您只会使用Generic Constraints 传递某些类型。那么你只能允许适用的类型调用该方法。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多