2009-10-14 7 views
5

スタックOverflowersするクラスのプロパティを必要とする:VB.NETには、リストの配列

私はクラスのプロパティであることを配列型(Tの)リストを取得しようとしている私の脳をラッキングされています。私はそれを行う簡単な方法がなければならないことを知っており、私はグーグルで良い例を見つけることができません。私はそれを使用しようとすると、 "オブジェクトのインスタンスに設定されていないオブジェクト参照"エラーが発生すると思うクラスを作成するたびにエラーが発生します。今私の考えは、私が望んでいた方法では使えないということです。ここに私の最新の試みです:

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

+0

あなたはそうです、それはコレクションです。私がタイプしたのは遅かった。 – NinjaBomb

答えて

12

あなたは、アイテムを置こうとしているリストのインスタンスを作成していません。

アクセサリクラスのコンストラクタで初期化します。

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

ザ・

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

ような何かあなたはとNullReferenceExceptionを避けるために2つのオプションを持っていますこの方法の問題は、後で使用することが常に有効であることをあなたが知っているどこかで初期化しないと、同じチェックをしたり初期化したりする必要があるということです。それはフォームロードなどにあるかもしれません。

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" 
+0

私はそれが単純なものであることを知っていました。オプション2は私の状況に完全に適合します。ありがとう。 – NinjaBomb

+0

追加調査を行い、両方の提案をテストした後、elder_georgeの投稿に対する私の感謝した回答を変更しました。 – NinjaBomb

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 

にです私とうまく動作します...

関連する問題