2013-05-29 72 views
2

我創建了下面的擴展方法的變量:會話使用的擴展方法

<System.Runtime.CompilerServices.Extension()> _ 
Public Function ToIntegerOrDefault(ByVal valueToParse As Object, Optional ByVal defaultValue As Integer = 0) As Integer 
    Dim retVal As Integer = 0 
    If Not Integer.TryParse(valueToParse.ToString, retVal) Then 
    retVal = defaultValue 
    End If 
    Return retVal 
End Function 

,我想利用這個擴展方法上的會話變量像這樣:

ReadOnly Property NodeID As Integer 
    Get 
    Return Session(SessionVariables.SELECTED_NODE_ID).ToIntegerOrDefault() 
    End Get 
End Property 

但是,在設置會話變量之前調用該方法後,會出現NullReferenceException消息Object variable or With block variable not set.

是否有安全的方式來利用以這種方式在會話變量上擴展方法(假定會話變量可能爲空)?

+0

你的代碼看起來很好,你的會話密鑰是否有效? –

+0

我會查看該值是否爲空。 –

回答

1

對於object類型(應該是另一種類型)VB.NET: impossible to use Extension method on System.Object instance,不可能使用擴展方法。 A和擴展方法模塊需要進口,所以你可以使用:

ReadOnly Property NodeID As Integer 
    Get 
    Return ToIntegerOrDefaultSession(SessionVariables.SELECTED_NODE_ID)) 
    End Get 
End Property 

或者你可以重寫擴展方法

<System.Runtime.CompilerServices.Extension()> _ 
Public Function ToIntegerOrDefault(Sess As HttpSessionState, KeyOFvalueToParse As String, Optional ByVal defaultValue As Integer = 0) As Integer 
    Dim retVal As Integer = 0 
    If Not Integer.TryParse(Sess(KeyOFvalueToParse).ToString, retVal) Then 
    retVal = defaultValue 
    End If 
    Return retVal 
End Function 

並調用

Session.ToIntegerOrDefault(SessionVariables.SELECTED_NODE_ID) 

或定義的擴展方法String並致電

Cstr(Session(SessionVariables.SELECTED_NODE_ID)).ToIntegerOrDefault() 
+0

優秀,徹底的答案。非常感謝。 – Daniel

0

當您聲明它時,給會話一個默認值。如果這是一個使用新關鍵字的列表將會訣竅。如果是其他東西,你必須展示它是什麼。

+0

如果你提供了一個如何去做的例子,那將會很好。 – Neolisk

+0

當OP沒有說明集合是什麼時,你如何提供初始化集合的例子?就在我頭頂,我可以拿出六個不同的收藏。 – tinstaafl

+0

你好。擴展方法接受一個對象,嘗試將其解析爲一個整數,然後返回解析的值(或者如果失敗,則返回可選的缺省值)。沒有收藏。 – Daniel