.net 将对象引用强制转换为其泛型类型
我有一个.net 将对象引用强制转换为其泛型类型,.net,vb.net,generics,.net,Vb.net,Generics,我有一个对象,它实际上是一个带有未知类型参数的泛型。如何将其转换为正确的泛型类型?例如,以下是我的通用: 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
对象
,它实际上是一个带有未知类型参数的泛型。如何将其转换为正确的泛型类型?例如,以下是我的通用:
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()
的“命名类型”参数?不使用反射,更合理的设计可以帮助您。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
明确指出它需要有名称的东西,编译器可以对此进行检查。您不必依赖程序员只传递有效对象。更合理的设计可以帮助您,而不是使用反射。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
明确指出它需要有名称的东西,编译器可以对此进行检查。您不必依赖程序员只传递有效对象。更合理的设计可以帮助您,而不是使用反射。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
明确指出它需要有名称的东西,编译器可以对此进行检查。您不必依赖程序员只传递有效对象。更合理的设计可以帮助您,而不是使用反射。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
明确指出它需要有名称的东西,编译器可以对此进行检查。您不必依赖程序员只传递有效对象