2014-10-07 95 views
1

我創建了一個請求類。下面是它的一個簡化版本:需要幫助初始化VB.Net中的泛型屬性

Public Class Request(Of T) 
    Private _Account As String 
    Public Property Account() As String 
     Get 
      Return _Account 
     End Get 
     Set(ByVal value As String) 
      _Account = value 
     End Set 
    End Property 
    Private _InnerRequest As T 
    Public Property InnerRequest() As T 
     Get 
      Return Me._InnerRequest 
     End Get 
     Set(ByVal value As T) 
      Me._InnerRequest = value 
     End Set 
    End Property 
End Class 

然後,我有,我打算用這一個使用其他兩個類 - 再次,簡稱

Public Class Individual 
    Public FirstName As String 
    Public LastName As String 
    Friend Sub New() 
    End Sub 
End Class 

而且

Public Class Commercial 
    Public EntityName As String 
    Friend Sub New() 
    End Sub 
End Class 

再次,這兩個都很簡短。問題進來時,我嘗試使用個人或商業的性質:

Dim Req As New Request(Of Individual)() 
Req.InnerRequest.FirstName = "Herman" <-- Null Ref Exception 

所以...我怎麼得到我的內在要求空裁判例外踢?我嘗試在Request的New子部分簡單地使用Me._InnerRequest = New T,但沒有骰子。有沒有辦法解決這個問題?

+1

除非您使用的是舊版本的.Net Framework,否則如果您僅使用默認獲取器和設置器,則不需要所有'_BackingFields'和'Get's /'Set's。而@巴里是對的。 'Req.InnerRequest'永遠不會被設置,所以它是空的。 – 2014-10-07 19:24:40

+0

還有一點比我在這裏提出的更多,所以它不是默認的。我沒有意識到我不需要支持領域,當我最初設置屬性時,它只是「專業」選項卡選項卡,併爲我填充所有內容,然後我進行調整。我會考慮簡化。 Barry的建議沒有在創建Request對象時實例化它,這是理想的我正在尋找的東西,但可能是不可能的。 – MattB 2014-10-07 19:32:44

回答

2

必須首先將Req.InnerRequest設置爲Individual的對象實例。

Req.InnerRequest = new Individual() 
Req.InnerRequest.FirstName = "Herman" 

或創建InnerRequest實例進行了以下修改

Public Class Request(Of T As {New}) 'Classes of type T must have a public new constructor defined 
:: 
Private _InnerRequest As New T() 'Creates a new class of type T when an instance is created of Request 

,使其他類Public代替Friend的構造函數。

比你可以直接做

Dim Req As New Request(Of Individual)() 
Req.InnerRequest.FirstName = "Herman" 
+0

啊......我正在做一個回覆,然後你編輯了。你的第二個建議得到了我正在尋找的東西。我無法從調用代碼創建新的個人,因爲它位於程序集外部。謝謝! – MattB 2014-10-07 19:37:33

2

@Barry已經回答的主要問題是什麼,但如果你喜歡對象初始化這裏是一個替代語法:

Req.InnerRequest = new Individual() With { FirstName = "Herman" } 

或者,如果你願意的話, Individual類的構造函數超載:

Dim individual As New Individual("Herman") 
Req.InnerRequest = individual 

隨着Individual類看起來像:

Public Class Individual 
    Public FirstName As String 
    Public LastName As String 

    Friend Sub New() 
    End Sub 

    Friend Sub New(firstName As String) 
     Me.FirstName = firstName 
    End Sub 

End Class 
+0

我不知道你提出的替代語法。巴里最終讓我的問題得到了解答,但這也是非常有用的。謝謝! – MattB 2014-10-07 19:38:26

+0

非常歡迎,很高興你得到了你正在尋找的答案! – 2014-10-07 19:38:48

2

你或許應該考慮限制的T一些Entity類:

Public Class Request(Of T As Entity) 

從哪個個人和商業將繼承:

Public Class Individual : Inherits Entity 

然後,可能會在此實體類(可以是抽象/ MustInherit)上聲明一個可重寫的屬性String的名稱,這應該提供一些靈活性TY。否則,你會很難花費你的設計模式。

+1

我打算說同樣的事情。或者至少將其限制爲實現接口的東西。 'IRequestable'有一個很好的戒指,哈哈。 – 2014-10-07 19:36:53

+1

我也會嘗試一下。這是我沒有考慮過的另一個有趣的想法 - 但使用我目前使用的方法爲將來的InnerRequest添加新類型可能會更方便。不過,一個非常有趣的想法。謝謝! – MattB 2014-10-07 19:40:17