如何为Double类型的变量赋值,该变量已作为Object传递?

时间:2013-07-03 11:29:23

标签: vb.net visual-studio-2010

我正在尝试为全局变量赋值,该变量的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,但应该有比这更简单的东西......

2 个答案:

答案 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这样的“等效类型”时。