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
。