我正在尝试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
答案 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
是最合理的方式。