您可以比较泛型类型T
,如下所示:
Private Sub DoStuff(Of T)(ByRef list As List(Of T))
If GetType(T) = GetType(String) Then
'Do some string stuff
Else GetType(T) = GetType(Integer) Then
'Do some Integer stuff
End If
End Sub
或者,您甚至可以将其作为一个Select
块来执行:
Private Sub DoStuff(Of T)(ByRef list As List(Of T))
Select GetType(T)
Case GetType(String)
'Do some string stuff
Case GetType(Integer)
'Do some Integer stuff
End Select
End Sub
不言而喻,但我想我应该补充一点,如果可能的话,应该不鼓励和避免检查这样的类型。这样做会导致乱七八糟的意大利面条代码,并且有点违背使用泛型参数的全部目的。通常,当你开始需要做这样的事情时,这是一个很好的迹象,表明你做的不好,你需要重新考虑你的设计。
至于List(Of ParentClass)
和List(Of SubClass)
不匹配,这是人们对泛型的常见混淆。泛型的工作方式是,可以为泛型类型参数提供的每种可能类型都将被视为完全独立的数据类型,与任何其他数据类型完全无关。所以,List(Of X)
和List(Of Y)
被视为完全不同的类型,无论关系X
和Y
可能共享。换句话说,它本质上是创建新类型的简写,如下所示:
Public Class ListOfSubClass
Inherits List(Of SubClass)
End Class
Public Class ListOfParentClass
Inherits List(Of ParentClass)
End Class
如果你这样做了,你就不会期望ListOfParentClass
与 兼容ListOfSubClass
,因为它们彼此之间没有任何关系。同样,您也不应该期望泛型以这种方式工作。
编辑
虽然我所说的关于同一泛型类的不同类型之间的强制转换不兼容是正确的,但它不再是全部。从 Visual Studio 2010 和 4.0 版本的框架开始,.NET 支持协变和逆变,这有助于解决这个问题。有关详细信息,请参阅MSDN 文章。