2009-10-14 17 views
5

Pila Overflowers:VB.NET necesita una propiedad de clase a ser una serie de listas

he estado devanando los sesos tratando de obtener una lista (de T) tipo de matriz a ser la propiedad de una clase. Sé que tiene que haber una forma simple de hacerlo y no puedo encontrar un buen ejemplo en Google. Cada vez que creo una clase que creo que funcionará obtengo el error "Referencia de objeto no configurado a una instancia de un objeto" cuando intento usarlo. Mi pensamiento ahora es que no puedo usarlo de la manera en que esperaba. Aquí está mi último intento:

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 

que estoy tratando de devolver la clase MasterItem de una función de prueba de la siguiente manera:

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 

¿Qué estoy haciendo mal aquí? Gracias por adelantado.

+0

Las listas no son matrices. – recursive

+0

Tienes razón, es una colección. Era tarde cuando lo tipeé. – NinjaBomb

Respuesta

12

No ha creado una instancia de la lista a la que está intentando colocar elementos.

Inicialízalo en el constructor de tu clase de Accesorio. Algo así como

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

Tienes 2 opciones para evitar la NullReferenceException:

1) El elder_george enfoque mencionado, en el que inicializar la propiedad a una nueva instancia de la clase:

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

El El problema con este enfoque es que si no lo inicializa en algún lugar que sabe que siempre será válido para usarlo más adelante, tendrá que hacer la misma comprobación y/o inicializar. Ese "en algún lugar" podría estar en una carga de formulario o tal.

2) Inicialice la variable del almacén de respaldo de la propiedad. Haga esto una vez y no necesita verificar nulo todo el tiempo. Observe el cambio en la declaración _item a continuación:

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 

Con lo anterior en su lugar, usted podrá acceder a ella directamente como:

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

Sabía que era algo simple que seguía pasando por alto. La opción n. ° 2 se ajustará perfectamente a mi situación. Gracias. – NinjaBomb

+0

Cambié mi respuesta de acceso a la publicación de elder_george después de realizar algunas investigaciones adicionales y probar ambas sugerencias. – NinjaBomb

0

intentar algo como esto ..

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 

¡Es trabajando bien conmigo ...

Cuestiones relacionadas