2009-10-14 73 views
5

堆栈Overflowers:VB.NET需要一个类属性是一个列表阵列

我一直在货架我的大脑试图得到一个列表(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 

什么我错在这里做什么?提前致谢。

+0

列表不是数组。 – recursive 2009-10-14 05:23:47

+0

你是对的 - 这是一个集合。我打字的时候已经很晚了。 – NinjaBomb 2009-10-14 13:59:42

回答

12

您尚未创建要尝试放置项目的列表实例。

在您的Accessory类的构造函数中初始化它。喜欢的东西

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

您有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)初始化属性的后备存储变量。这样做一次,你不需要一直检查空值。请注意下面的_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" 
+0

我知道这很简单,我只是不停地俯瞰。选项#2将完全适合我的情况。谢谢。 – NinjaBomb 2009-10-14 14:00:57

+0

在做了一些额外的研究和测试这两个建议后,将我的答案更改为elder_george的帖子。 – NinjaBomb 2009-11-01 01:59:34

0

尝试这样的事情..

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 

这是与我一起工作...

相关问题