【问题标题】:Casting an Object reference into its generic type将 Object 引用转换为其泛型类型
【发布时间】:2014-07-31 15:02:51
【问题描述】:

我有一个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() 的“命名类型”参数不起作用?

【问题讨论】:

    标签: .net vb.net generics


    【解决方案1】:

    而不是使用反射,一个更合理的设计可以帮助你。 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 明确声明它需要有名字的东西,编译器可以检查这个。您不必依赖程序员只传递有效的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2019-06-22
      • 1970-01-01
      • 2018-11-12
      相关资源
      最近更新 更多