Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将对象引用强制转换为其泛型类型_.net_Vb.net_Generics - Fatal编程技术网

.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
明确指出它需要有名称的东西,编译器可以对此进行检查。您不必依赖程序员只传递有效对象