VB.NET Доступ к переменным класса в словаре - PullRequest
1 голос
/ 26 марта 2012

Я не уверен в синтаксисе, необходимом для доступа к атрибутам класса внутри объявления Dictionary.

Public food As New Dictionary(Of String, cheese) From
{
    {"cheese1", New cheese},
    {"cheese2", New cheese},
    {"cheese3", New cheese}
}

Public Class cheese
    Public info As New Dictionary(Of String, Array) From
    {
        {"attributes1",
            {New Dictionary(Of String, String) From
                {
                    {"name", "test"},
                    {"taste", vbNullString},
                    {"color", vbNullString}
                }
            }
        },
        {"attributes2",
            {New Dictionary(Of String, String) From
                {
                    {"name", "test"},
                    {"taste", vbNullString},
                    {"color", vbNullString}
                }
            }
        }
    }
End Class

Так что, если я хочу проверить это и использовать MsgBox(), как мне потянуть вниз, скажем, name в food > cheese1 > info > attributes2 > name?

EDIT: Я только что понял, что Array в info должен быть словарём для ассоциативного массива, поэтому, пожалуйста, проигнорируйте эту ошибку и просто предположите, что это словарь для этого вопроса.

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Ну, вот как это сделать (с учетом вашего Array комментария):

Dim name As String = food("cheese1").info("attributes2")("name")

Если вы оставите этот внутренний словарь как <String, Array>, то у вас будет это, которое будет возвращать значение «имя» 0-го словаря:

Dim name As String = food("cheese1").info("attributes2")(0)("name")

Но, как я намекал в своем комментарии, это действительно плохой дизайн. Вот один из способов повторить это:

Dim food As New Food()
food.CheeseAttributes.Add(New Cheese("Cheddar", "Awesome", "Yellow"))
food.CheeseAttributes.Add(New Cheese("Pepperjack", "Spicy", "White"))

Это может быть достигнуто путем рефакторинга ваших классов в это:

Public Class Food

    Private _cheeseAttributes As IList(Of Cheese)

    Public Sub New()

    End Sub

    Public ReadOnly Property CheeseAttributes() As IList(Of Cheese)
        Get
            If _cheeseAttributes Is Nothing Then
                _cheeseAttributes = new List(Of Cheese)()
            End If
            Return _cheeseAttributes
        End Get
   End Property

End Class

Public Class Cheese

    Private _name As String
    Private _taste As String
    Private _color As String

    Public Sub New (ByVal name As String, ByVal taste As String, ByVal color As String)
        Me.Name = name
        Me.Taste = taste
        Me.Color = color
    End Sub

    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

    Public Property Taste() As String
        Get
            Return _taste
        End Get
        Set(ByVal value As String)
            _taste = value
        End Set
    End Property

    Public Property Color() As String
        Get
            Return _color
        End Get
        Set(ByVal value As String)
            _color = value
        End Set
    End Property
End Class

Возможно, есть и лучшие способы, но это только для иллюстрации.

0 голосов
/ 26 марта 2012

Предоставление некоторых методов, помогающих извлекать элементы, помогло бы, но я считаю, что синтаксис, который у вас есть, будет

food.Item ("cheese1"). Info.Item ("attribute2") (0) .Item ("name")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...