0

我正在尝试为具有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的建议传递作为参考,但没有成功。我还阅读了有关使用 Reflection的信息,但应该有比这更简单的东西......

4

2 回答 2

2

当您将 home.surface 添加到列表中时,您将 double 的副本添加到列表中,然后调整该副本。将手表贴在“o”上,看看它在 home.surface 保持不变的情况下如何变化。

如果您想使用反射,请尝试以下方法。

Dim prop As Reflection.PropertyInfo = o.GetType().GetProperty("Surface")
prop.SetValue(o, 45.6)
于 2013-07-03T11:36:15.830 回答
1

Variable.GetType你永远在一起Object,因为这就是类型Variable。您可以使用 anObject将其转换/转换为不同的类型(如Double)。

确定来自何处的“原始类型”的最佳方法Object是包含一个额外的变量来告诉它。另一种选择可能是将给定Object的转换为目标Type,看看它是否不是什么/不会触发错误。但是第二个选项不太准确,主要是在处理像双精度/整数这样的“等效类型”时。

于 2013-07-03T11:38:17.970 回答