VB.NET нужно свойство class быть массивом list

Стек Overflowers:

Я ломал голову, пытаясь получить массив типа List(of T) как свойство класса. Я знаю, что должен быть простой способ сделать это, и я не могу найти хороший пример в google. Каждый раз, когда я создаю класс, который, как я думаю, будет работать, я получаю ошибку "ССЫЛКА на объект не установлена на экземпляр объекта", когда я пытаюсь его использовать. Теперь я думаю, что не могу использовать его так, как надеялся. Вот мой последний попытка:

Public Class Item
    Private _itemno As String
    Public Property ItemNo() As String
        Get
            Return _itemno
        End Get
        Set(ByVal value As String)
            _itemno = value
        End Set
    End Property
        //Many more properties in here
End Class


Public Class Accessory
    Private _items as List(of Item)
    Public Property Items() As List(of Item)
        Get
            Return _itemno
        End Get
        Set(ByVal value As List(of Item))
            _itemno = value
        End Set
    End Property
End Class

Public Class MasterItem
    Private _item as Item
    Public Property PrimaryItem as Item
        Get
            Return _item
        End Get
        Set(ByVal value As Item)
            _item = value
        End Set
    End Property

    Private _accessories as Accessory
    Public Property Accessories() As Accessory
        Get
            Return _accessories
        End Get
        Set(ByVal value As Accessory)
            _accessories = value
        End Set
    End Property
End Class

Я пытаюсь вернуть класс MasterItem из тестовой функции следующим образом:

Public Shared Function GetItem() as MasterItem
    Dim testItem as new MasterItem

    ReturnItem.PrimaryItem.ItemNo = "TEST123"

    ReturnItem.Accessories.Items.add(New Item("TESTACC1"))
    ReturnItem.Accessories.Items.add(New Item("TESTACC2"))

    Return testItem
End Function

что я делаю неправильно здесь? Спасибо заранее.

3 ответов


вы не создали экземпляр списка, в который пытаетесь поместить элементы.

инициализируйте его в конструкторе вашего класса аксессуаров. Что-то вроде

Public Sub New()
    _items = New List(Of Item)
End Sub

у вас есть 2 варианта, чтобы избежать исключения NullReferenceException:

1) упомянутый подход elder_george, где вы инициализируете свойство к новому экземпляру класса:

Dim ReturnItem As New MasterItem
ReturnItem.PrimaryItem = New Item()
' or check for null then initialize (optional, depends on your needs)
If ReturnItem.PrimaryItem Is Nothing Then ReturnItem.PrimaryItem = New Item()

проблема с этим подходом заключается в том, что если вы не инициализируете его где-то, что вы знаете, что он всегда будет действителен для использования позже, вам придется сделать ту же проверку и/или инициализировать. Это "где-то" может быть на загрузке формы или что-то в этом роде.

2) инициализировать поддержку отеля хранить переменную. Сделайте это один раз, и вам не нужно постоянно проверять значение null. Обратите внимание на изменение в _item декларации ниже:

Public Class MasterItem
    Private _item as Item = New Item()
    Public Property PrimaryItem as Item
        Get
            Return _item
        End Get
        Set(ByVal value As Item)
            _item = value
        End Set
    End Property
End Class

с вышеуказанным на месте, вы получили бы доступ к нему непосредственно как:

Dim ReturnItem As New MasterItem
ReturnItem.PrimaryItem.ItemNo = "TEST123"

попробуйте что-то вроде этого ..

Public Class ActiveInfo
    Private _services As List(Of ActiveService)

    Public Sub New()
        _services = New List(Of ActiveService)
    End Sub
    Public Property Services() As List(Of ActiveService)
        Get
            Return _services
        End Get
        Set(ByVal value As List(Of ActiveService))
            _services = value
        End Set
    End Property
End Class

он отлично работает со мной...