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



我在VB尝试。. NET (framework 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...

但如果值是什么我不知道如何获得类型。我试过这种方法,但不工作:

container.GetType() 
TypeOf (contenedor) is Integer 
TypeOf (contenedor) is Nullable(of Integer) 

我知道有人可能会回答说"容器"什么都不是,因为没有引用任何对象,你不能知道类型。但这似乎是错误的,因为我发现了一个技巧来解决这个问题:创建一个重载函数来进行强制转换,这样:

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)

如果"container"是Date则调用

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

这是正确的,. net知道对象的类型,因为调用正确的重载函数。所以我想找出(如。net所做的)一种方法来确定具有nothing值的可空对象的类型。

Thx

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

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

关于为什么装箱/拆箱被设置成这样工作的一些信息,参见装箱/拆箱空类型-为什么这样实现?简而言之,这是使用可空类型作为Object的最明智的方法。

相关内容

  • 没有找到相关文章

最新更新