将Object引用转换为其泛型类型

时间:2014-07-31 15:02:52

标签: .net vb.net generics

我有一个Object,它实际上是一个带有未知类型参数的泛型。如何将其转换为正确的泛型类型?例如,这是我的通用:

Public Class MyGeneric(Of T)
    Public Property Name As String

    Public Sub New(ByVal withName As String)
        Name = withName
    End Sub
End Class

这是我想要做的事情:

Public Sub Main()
    Dim a As Object = New MyGeneric(Of String)("a")
    Dim b As Object = New MyGeneric(Of Integer)("b")
    PrintName(a)
    PrintName(b)
End Sub

Public Sub PrintName(ByVal forValue As Object)
    Dim itsType = forValue.GetType()

    If (itsType.IsGenericType() AndAlso itsType.GetGenericTypeDefinition() Is GetType(MyGeneric(Of ))) Then
        Debug.Print(DirectCast(forValue, MyGeneric(Of )).Name)
    End If
End Sub

为什么第一个MyGeneric(Of )适用于"命名类型" GetType()的参数,但第二个MyGeneric(Of )不适用于"命名类型" DirectCast()的参数?

1 个答案:

答案 0 :(得分:3)

不使用反射,更合理的设计可以帮助您。 PrintName实际上做了什么?它打印出某些东西的名称。那东西应该有一个名字。那么为什么不为它创建一个界面呢?

Public Interface IHasName
    Property Name As String
End Interface

...让你的通用类实现它......

Public Class MyGeneric(Of T)
    Implements IHasName

    Public Property Name As String Implements IHasName.Name

    '...
End Class

然后你可以这样做:

Public Sub PrintName(ByVal forValue As IHasName)
    Debug.Print(forValue.Name)
End Sub

Dim a = New MyGeneric(Of String)("a")
PrintName(a)

如果你不能确定它的类型正确,那么这比围绕一个物体更清洁。现在PrintName明确声明它需要一些带有名称的东西,编译器可以检查它。您不必依赖程序员只传递有效的对象。