2009-10-14 71 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 

這是與我一起工作...

相關問題