Vb.net 获取值位于列表中的属性的值

Vb.net 获取值位于列表中的属性的值,vb.net,list,class,properties,Vb.net,List,Class,Properties,谷歌让我失望了,所以我转向堆栈溢出。你是我唯一的希望 我有一个类,它有几个属性。其中一个属性是双精度的列表。我希望能够阅读列表中的每个双精度字符,并将它们打印到文本框中 Public Class MyClass Dim aValue As List(Of Double) Public Property myProp As List(Of Double) Get Return aValue 'This very well could be

谷歌让我失望了,所以我转向堆栈溢出。你是我唯一的希望

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

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
myProp
然后我希望能够获取属性
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
上面的代码可能有几个问题。不过在这一点上,我会接受任何我能得到的帮助。如果有更好的方法可以做到这一点,而不必将列表作为属性,那么这也是一个受欢迎的解决方案。我使用列表作为属性的主要原因是,我使用XmlSerializer将类和属性快速轻松地转换为XML文件进行存储

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

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
myProp
啊,就这样。列表中没有添加任何值,但我至少得到了属性的名称,因此该部分至少是正确的


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

您可能根本不想为此属性设置
。这样做:

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
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
然后添加如下值:

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
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
注意,我使用了
myClassInstance
而不是
myClass
。为了使用类,必须在变量中实际创建它的实例。从
公共类myClass
结束类
的所有内容都只描述了创建类的对象实例后该类的行为,但它还没有在内存中实际创建任何可以使用的对象实例。在某个地方,你必须先说
newmyclass()
,然后才能使用任何东西

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

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
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

在您能够理解类的实例和类的定义之间的区别,以及如何在类的对象引用中使用变量之前,您将很难编写任何工作代码。

仅从这一点来看,我就可以看到一个问题:p.GetType将始终返回PropertyInfo的类型。也许你想要p.Value.GetType.Yep,你完全正确。最后我使用p.PropertyType来确定属性的类型。谢谢很抱歉,我不想对值位进行太深入的讨论,因为我非常确定这是有效的,但在随机发生器之前,我确实有
Dim c作为myClass=New myClass
。我将更新我的原始问题以反映这一点,并感谢您指出这一点。还有,非常感谢你的帮助!我会试一试,但根据你过去的经验,我相当肯定这会奏效在这种情况下,在我的大多数示例代码中,
myClassInstance
可以变成
c
,但您需要一种方法在两个部分中引用相同的
c