如何确定泛型 class VB.NET 中的类型

How to determine type in generic class VB.NET

假设我有这样一个 class:

Public Class(Of T As Bar) Foo
...
End Class

我想设置如下内容:

Public Class(Of T As Bar) Foo
    Public Sub New()
        Select T
        Case Class1 'Inherits Bar
            'do stuff
        Case Class2 'Inherits Bar
            'do stuff
        Case Class3 'Inherits Bar
            'do stuff
        End Select
    End Sub
End Class

显然 这行不通,但您可能会从这个片段中了解我正在尝试做什么.那么在VB.NET中如何正确判断传递给构造函数的Type呢?令人惊讶的是,我在 Stack Overflow 上找不到任何关于此的信息。

C# 具有以下语法:

Type typeParameterType = typeof(T);

然而,

Dim typeParameterType As Type = TypeOf T

不起作用,

也不行
Dim typeParameterType As Type = T

C# 不允许在 typeof 上使用 switch。但是,VB 确实允许这样做,因此您可以尝试这样的操作:

Public Class Foo(Of T As Bar)
    Public Sub New()
        Select Case GetType(T)
            Case GetType(BarA)
                ' Do stuff

            Case GetType(BarB)
                ' Do stuff
        End Select
    End Sub
End Class

我发现执行此操作的最有效方法是将委托作为泛型 class 的静态(共享)成员,它在静态构造函数中分配。类似于:

Public Class Foo(Of T As Bar)
    Shared DoStuff As Action(of T) = AddressOf NormalDoStuff
    Shared Sub New()
      Foo(Of Class1).DoStuff = AddressOf Class1DoStuff
      Foo(Of Class2).DoStuff = AddressOf Class2DoStuff
      Foo(Of Class3).DoStuff = AddressOf Class3DoStuff
    End Sub

    Public Sub New(SomeParameter As T)
        DoStuff(SomeParameter)
    End Sub
End Class

第一次尝试使用具有特定通用类型的 class 时,此方法需要做一些额外的工作,但之后 DoStuff 将正确地直接分派到适当的方法。如果代码中有多个点的行为需要在不同的 class 中有所不同,只需定义更多静态(共享)委托即可。