.net 将(DerivedObject的)列表转换为(BaseObject的)列表

.net 将(DerivedObject的)列表转换为(BaseObject的)列表,.net,vb.net,generics,.net,Vb.net,Generics,比如说,我有一个操作基本对象列表的函数。但是我有一个派生对象的列表。最有效的方法是什么 让我们吃点东西吧 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)) ...

比如说,我有一个操作基本对象列表的函数。但是我有一个派生对象的列表。最有效的方法是什么

让我们吃点东西吧

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)) ...
谢谢。

您可以使用T.ConvertAll列表,也可以使用CastOf T和ToList。我的VB语法可能错误,但:

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

或者,如果您使用.NET 4及其通用协方差,您可以使用:

Me.Delete(myButtons.ToList(Of Control)())
或者更好,只需将Delete的签名更改为:

您可以使用ListOf T.ConvertAll,或者只使用CastOf T和ToList。我的VB语法可能错误,但:

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

或者,如果您使用.NET 4及其通用协方差,您可以使用:

Me.Delete(myButtons.ToList(Of Control)())
或者更好,只需将Delete的签名更改为:


如果您需要显式转换,或者可以作为转换来完成,则可以使用Linq。

如果您需要显式转换,或者可以作为转换来完成,则可以使用Linq。

我无法更改删除的签名,我有一个疯狂的团队。。。谢谢最好是用按钮列表更改删除的签名。。。在我的情况下…@moldovanu:想要选项严格到完全相反的程度并没有什么疯狂的-我想说,大多数时候想要关闭它是疯狂的,但你仍然可以将签名更改为最新版本并使用通用协方差。我不能更改删除的签名,我有一个疯狂的团队。。。谢谢最好是用按钮列表更改删除的签名。。。在我的情况下…@moldovanu:想要选项严格到完全相反的程度并没有什么疯狂的-我想说,大多数时候想要关闭它是疯狂的,但你仍然可以将签名更改为最新版本,并使用通用协方差。