3

私はVBで作業している次のコードを持っています:

  Public Shared Function LoadFromSession(Of T)(sessionKey As String) As T
    Try
      ' Note: SBSSession is simply a reference to HttpContext.Current.Session
      Dim returnValue As T = DirectCast(SBSSession(sessionKey), T)
      Return returnValue
    Catch ex As NullReferenceException
      ' If this gets thrown, then the object was not found in session.  Return default value ("Nothing") instead.
      Dim returnValue As T = Nothing
      Return returnValue
    Catch ex As InvalidCastException
      ' Instead of throwing this exception, I would like to filter it and only 
      ' throw it if it is a type-narrowing cast
      Throw   
    End Try
  End Function

私がやりたいことは、縮小変換に対して例外をスローすることです。たとえば、5.5 のような 10 進数をセッションに保存した場合、それを整数として取得しようとすると、InvalidCastException をスローしたいと思います。 DirectCastこれはうまくいきます。

ただし、拡大変換を許可したいと思います (たとえば、5 のような整数をセッションに保存し、それを 10 進数として取得します)。 DirectCastこれは許可されませんが、許可さCTypeれます。残念ながら、CType縮小変換も可能です。つまり、最初の例では、値 6 が返されます。

目的の動作を実現する方法はありますか? おそらく、VB を使用して例外をフィルタリングすることによってCatch...Whenですか?

4

2 に答える 2

1

コメントに記載されているように、一般的にナローイングは得られたアイデアではないため、タイプを確認し、特定のケースを必要な方法で変換することをお勧めします。

dim q as object = SBSSession(sessionKey)
If q.GetType Is GetType(System.Int32) Then ...

一般的な縮小と拡大の問題は、それが一方向の関係ではないことです。場合によっては、ペアの型のそれぞれに、もう一方の型には含まれない値が含まれる場合があります。

于 2013-10-08T03:18:38.040 に答える