我正在尝试为全局变量赋值,该变量的Property
类型为Double
。此Property
作为Object
传递,分配失败。
在下面的示例代码中,该值永远不会分配给实际对象,而只能分配给本地:
Public Class Form1
Friend Home As New Building
Private Sub AssignValues() Handles Me.Load
'Objects of different types are added to a list
Dim listObjects As New List(Of Object)
listObjects.Add(Home.Surface)
'All the Objects in listObjects are assigned a value that
'is stored as String
For Each o As Object In listObjects
SetProperty(o, "45.6")
Debug.Print("Surface = " & Home.Surface.ToString)
Next
End Sub
Private Sub SetProperty(ByRef Variable As Object, ByVal Value As String)
Select Case Variable.GetType
Case GetType(Double)
Variable = CDbl(Value)
Case Else
'...
End Select
End Sub
End Class
Public Class Building
Dim _surface As Double = 0
Public Property Surface As Double
Get
Return _surface
End Get
Set(ByVal value As Double)
_surface = value
End Set
End Property
End Class
该计划总是输出Surface = 0
而不是45.6
。我做错了什么?
我尝试将Variable
作为参考传递,如建议here,但没有成功。我也读到了using Reflection,但应该有比这更简单的东西......
答案 0 :(得分:2)
当您将home.surface添加到列表中时,您需要将double的副本添加到列表中,然后调整该副本。将手表贴在“o”上,看看它是如何变化的,而home.surface保持不变。
如果你想使用反射,可以尝试这些方法。
Dim prop As Reflection.PropertyInfo = o.GetType().GetProperty("Surface")
prop.SetValue(o, 45.6)
答案 1 :(得分:1)
使用Variable.GetType
,您将始终Object
,因为这是Variable
的类型。您可以使用Object
将其转换/转换为其他类型(例如Double
)。
确定Object
所来自的“原始类型”的最佳方法是包含一个额外的变量来告诉它。另一个选项可能是将给定的Object
转换为目标Type
并查看它是否为空/不会触发错误。但是这第二个选项并不太准确,主要是在处理像Doubles / Integers这样的“等效类型”时。