我有一个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()
的参数?
答案 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
明确声明它需要一些带有名称的东西,编译器可以检查它。您不必依赖程序员只传递有效的对象。