我在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
的最明智的方法。