获取具有Nothing值的Nullable属性的类型

时间:2013-06-06 15:03:11

标签: .net vb.net reflection types casting

我正在尝试VB.NET(框架3.5)获取具有Nothing值的Nullable属性的类型(其默认值),以了解如何制作CType。代码将是这样的:

Class DinamicAsign
Public Property prop As Integer?
Public Property prop2 As Date?

Public Sub New()
    Asign(prop, "1")
    Asign(prop2, "28/05/2013")
End Sub

Public Sub Asign(ByRef container As Object, value As String)
    If (TypeOf (container) Is Nullable(Of Integer)) Then
        container = CType(value, Integer)
    ElseIf (TypeOf (container) Is Nullable(Of Date)) Then
        container = CType(value, Date)
    End If
End Sub
End Class

此代码无法正常运行。问题是如何知道“容器”的类型。

如果“prop”有值(“prop”不是什么),则此代码有效:

If (TypeOf(contenedor) is Integer) then...
If (contenedor.GetType() is Integer) then...

但如果价值不算什么,我不知道如何获得Type。我尝试过这种方式,但不起作用:

container.GetType() 

TypeOf (contenedor) is Integer 

TypeOf (contenedor) is Nullable(of Integer) 

我知道有人可以回答“容器”是什么都没有,因为没有引用任何对象,你也无法知道Type。但这似乎是错误的,因为我找到了一个解决这个问题的技巧:创建一个重载函数来进行转换,这样:

Class DinamicAsign2
Public Property prop As Integer?
Public Property prop2 As Date?

Public Sub New()
    Asignar(prop, "1")
    Asignar(prop2, "28/05/2013")
End Sub

Public Sub Asignar(ByRef container As Object, value As String)
    AsignAux(container, value)
End Sub

Public Sub AsignAux(ByRef container As Integer, value As String)
    container = CType(value, Integer)
End Sub

Public Sub AsignAux(ByRef container As Decimal, value As String)
    container = CType(value, Decimal)
End Sub
End Class

如果“container”是Integer,它将调用

public function AsignAux(byref container as Integer, value as string)

如果“容器”是Date将调用

public function AsignAux(byref container as Date, value as string)

这是正常的,.NET无论如何都知道Object的类型,因为调用正确的重载函数。 所以我想找出(就像.NET一样)确定没有任何值的可空对象类型的方法

THX

1 个答案:

答案 0 :(得分:3)

Nullable(Of T)成为Object时,类型数据会丢失:它会变为普通的Nothing或其代表的类型,例如Integer。您可以更改方法来执行此操作:

Public Sub Asign(Of T As Structure)(ByRef container As Nullable(Of T), value As String)
    ' T is Integer or Date, in your examples
    container = System.Convert.ChangeType(value, GetType(T))
End Sub

如果没有,您必须在其他地方记录该类型,并将其传递给您的方法。

有关为什么拳击/拆箱设置为以这种方式工作的一些信息,请参阅Boxing / Unboxing Nullable Types - Why this implementation?。简而言之,使用可空类型作为Object是最合理的方式。