3

例如,假设我想接受元素的通用列表作为方法参数,并根据构成列表的对象类型执行不同的操作。例如:

Private Sub DoStuff(Of T)(ByRef list As List(Of T) 
    If list.GetType() Is TypeOf(List(Of String) Then
        'Do some string stuff
    Else If list.GetType() Is TypeOf(List(Of Integer) Then  
        'Do some Integer stuff
    End If
End Sub

如果有一种方法可以查看类型T是什么,那也可以。我还尝试将我的论点设置为List(Of ParentClass)查看是否TypeOfList(Of SubClass),但随后它说 theList(Of ParentClass)永远不可能是List(Of SubClass)似乎没有意义的类型。

4

3 回答 3

8

您可以比较泛型类型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)被视为完全不同的类型,无论关系XY可能共享。换句话说,它本质上是创建新类型的简写,如下所示:

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 文章

于 2013-05-15T16:34:39.037 回答
6

如果您需要检查泛型参数以确定代码路径,那么您的方法不是真正的泛型,这种情况应该使用重载方法来处理:

Private Sub DoStuff(ByRef list as List(Of String))
Private Sub DoStuff(ByRef list as List(Of Integer))

ParentClass这在使用and时同样有效SubClass——将调用最具体的重载。

如果有DoStuff真正通用的共享方面,请将它们提取到另一个辅助方法中。

也就是说,您可以检查Tusing的类型GetType(T)

于 2013-05-15T16:46:26.283 回答
0

您可以为每种类型的通用列表创建一个具有相同名称的扩展方法吗?

在 C# 中类似:

var listOfStrings = new List<string>();
listOfStrings.DoStuff() //the extension method

var listOfInts = new List<int>();
listOfInts.DoStuff() //the extension method

扩展方法看起来像:

public static class listExtensions
{
   public static void DoStuff(this IList<string> theList)
   {
       // Stuff with strings
   }
   public static void DoStuff(this IList<int> theList)
   {
       // Stuff with ints
   }
}
于 2013-05-15T16:44:25.003 回答