6 Stimmen

VB.NET benötigt eine Klasseneigenschaft, die ein Listen-Array ist

Stack Overflowers:

Ich habe mir das Hirn zermartert und versucht, ein Array vom Typ List(of T) als Eigenschaft einer Klasse zu erhalten. Ich weiß, dass es einen einfachen Weg zu tun, und ich kann nicht finden, ein gutes Beispiel auf Google. Jedes Mal, wenn ich eine Klasse erstelle, von der ich denke, dass sie funktioniert, bekomme ich die Fehlermeldung "Object reference not set to an instance of an object", wenn ich versuche, sie zu verwenden. Ich denke jetzt, dass ich sie nicht so verwenden kann, wie ich es mir erhofft habe. Hier ist mein letzter Versuch:

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

Ich versuche, die MasterItem-Klasse aus einer Testfunktion wie folgt zurückzugeben:

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

Was mache ich hier falsch? Vielen Dank im Voraus.

14voto

elder_george Punkte 7709

Sie haben keine Instanz der Liste erstellt, der Sie Elemente hinzufügen möchten.

Initialisieren Sie es im Konstruktor Ihrer Accessory-Klasse. Etwas wie

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

1voto

Ahmad Mageed Punkte 91261

Sie haben 2 Möglichkeiten, um die NullReferenceException zu vermeiden:

1) Der von elder_george erwähnte Ansatz, bei dem Sie die Eigenschaft mit einer neuen Instanz der Klasse initialisieren:

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

Das Problem bei diesem Ansatz ist, dass Sie, wenn Sie ihn nicht an einem Ort initialisieren, von dem Sie wissen, dass er später immer gültig sein wird, dieselbe Prüfung und/oder Initialisierung durchführen müssen. Dieses "irgendwo" könnte beim Laden eines Formulars oder ähnlichem sein.

2) Initialisieren Sie die Backing Store Variable der Eigenschaft. Wenn Sie dies einmal tun, müssen Sie nicht ständig auf Null prüfen. Beachten Sie die Änderung in der _item Erklärung unten:

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

Mit den oben genannten Einstellungen können Sie direkt darauf zugreifen als:

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

1voto

MuniR Punkte 1333

Versuchen Sie so etwas wie das hier.

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

Bei mir funktioniert es einwandfrei...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X