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
он отлично работает со мной...