获取值在List中的Property的值

时间:2017-05-30 04:00:17

标签: vb.net list class properties

谷歌让我失望了,所以我转向Stack Overflow。你是我唯一的希望!

我有一个有几个属性的类。其中一个属性是双打列表。我希望能够读取列表中的每个双精度并将其打印到文本框中。

Public Class MyClass
    Dim aValue As List(Of Double)

    Public Property myProp As List(Of Double)

        Get
            Return aValue 'This very well could be my problem
        End Get
        Set(value As List(Of Double))
            'This is also likely the culprit, as I have no idea what to put here
        End Set

    End Property

End Class

所以,我有那堂课。然后,我尝试按如下方式初始化myProp的值:

Dim c As New MyClass()

Dim vals As New List(Of Double)

    For i = 0 To 11
        Dim rndVal = CInt(Math.Floor((10 - (-10) + 1) * Rnd())) + (-10)
        vals.Add(rndVal)
    Next

c.myProp = vals

然后我希望能够获取Property myProp并返回包含的myProp值,然后将它们打印到文本框中。这就是我目前所拥有的:

Public Class Calc

    Private Sub drpdwnBox_SelectedIndexChanged(sender As Object, e As EventARgs), Handles drpdwnBox.SelectedIndexChanged

        For Each p As Reflection.PropertyInfo In myClass.GetType().GetProperties()

            If p.CanRead Then

                'This works to get the name of the Property, but...
                txtBox.Text &= p.Name & " "

                'This does nothing, basically.
                If p.GetType Is GetType(List(Of Double)) Then

                    For Each k In p.GetValue(myClass, Nothing).Keys
                        txtBox.Text &= p.GetValue(myClass, Nothing).Keys.ToString() & " "
                        txtBox.Text &= vbNewLine
                    Next

                Else
                    'This also works to get the value of properties that aren't lists
                    txtBox.Text &= p.GetValue(Nation, Nothing).ToString() & vbNewLine

                End If

            End If

        Next

    End Sub

上面的代码可能存在一些问题。不过,在这一点上,我会得到任何帮助。如果没有List作为属性有更好的方法来做到这一点,那也是一个受欢迎的解决方案。我使用List作为Property方式的主要原因是我使用XmlSerializer快速轻松地将类和属性转换为XML文件进行存储。

无论如何,我运行此代码时得到的输出如下:

myProp

Aaaand就是这样。没有添加List的值,但我至少得到了Property的名称,因此该部分至少是正确的。

无论如何,感谢能够提供任何解决方案的任何人!

1 个答案:

答案 0 :(得分:0)

您可能根本不想拥有Set这个属性。这样做:

Public Class myClass
    Private aValue As New List(Of Double)

    Public Property myProp As List(Of Double)
        Get
            Return aValue 
        End Get    
    End Property

End Class

然后添加如下值:

For i = 0 To 11
    Dim rndVal = CInt(Math.Floor((10 - (-10) + 1) * Rnd())) + (-10)
    'myProp.Add() only needs the Get accessor!
    myClassInstance.myProp.Add(rndVal)
Next

注意我使用了myClassInstance而不是myClass。为了使用您的类,您必须在变量中实际创建它的实例。从Public Class myClass一直到End Class的所有内容都只描述了一个对象实例在创建一个对象实例后的行为,但是实际上在内存中创建了任何东西但你可以使用。在某个地方,你必须先说New myClass(),然后才能使用它。

拥有该变量后,您的最终代码段将更像这样:

Private Sub drpdwnBox_SelectedIndexChanged(sender As Object, e As EventARgs), Handles drpdwnBox.SelectedIndexChanged

    For Each k As Double In myClassInstance.myProp
        txtBox.Text &= k
    Next
End Sub

除非你能够理解类的实例和类的定义之间的区别,以及如何将变量与对象引用一起用于类,否则你将很难写任何工作代码。