【问题标题】:Transform List(Of DerivedObject) to List(Of BaseObject)将 List(Of DerivedObject) 转换为 List(Of BaseObject)
【发布时间】:2012-04-03 14:07:42
【问题描述】:

说,我有一个操作基础对象列表的函数。但我有一个派生对象列表。改造它的最有效方法是什么?

让我们来

Public Sub Main
  ...
  Dim myButtons as List(Of Button) = Me.GetMyButtons()
  Me.Delete(?? transform myButtons to myControls??)
  ...
End Sub 

Public Sub Delete(controls as List(Of Control)) ...

谢谢。

【问题讨论】:

    标签: .net vb.net generics


    【解决方案1】:

    您可以使用List(Of T).ConvertAll,或者只使用Cast(Of T)ToList。我的 VB 语法可能是错误的,但是:

    Me.Delete(myButtons.ConvertAll(Function(b) CType(b, Control)))
    

    Me.Delete(myButtons.Cast(Of Control)().ToList())
    

    或者,如果您使用的是 .NET 4(具有通用协方差),您可以使用:

    Me.Delete(myButtons.ToList(Of Control)())
    

    甚至更好,只需将Delete 的签名更改为:

    Public Sub Delete(controls as IEnumerable(Of Control)) ...
    

    【讨论】:

    • 我无法更改删除的签名,我有一个疯狂的团队...谢谢!更好的是用按钮列表更改删除的签名......在我的情况下......
    • @moldovanu:想要 Option Strict On 并没有什么疯狂的(恰恰相反——我会说大多数时候想要它关闭很疯狂),但你可以仍然将签名更改为最新版本并使用通用协方差。
    【解决方案2】:

    如果需要显式转换,可以使用 Linq 的 Select,如果可以作为强制转换完成,则可以使用 ConvertAllCast

    【讨论】:

      猜你喜欢
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2015-09-04
      • 1970-01-01
      相关资源
      最近更新 更多