2017-05-04 6 views
0

私は問題を抱えています。私は構造にいくつかの一般的なルールを適用したいと思います。それらのタイプが異なるので、汎用関数を使用してこれを行いたいと思います。私の問題は、指定された型のパラメータでしか利用できないメソッドを介して構造体を操作するために、大量のキャストを行うことなくその方法を見つけることができないということです。 DateTime値は常にUTCとして指定する必要があることを指定するために必要な手順を、例えば、以下を参照してください他の構造に汎用構造をキャストする

Public Shared Function Sanitize(Of T As Structure)(retValue As T?) As T? 
    ' If value is DateTime it must be specified as UTC: 
    If GetType(T) = GetType(DateTime) AndAlso retVal.HasValue Then 
     ' To specify the value as UTC, it must first be casted into DateTime, as it is not know to the compiler that the type in fact IS 
     ' DateTime, even if we just checked. 
     Dim retValAsObj = CType(retVal, Object) 
     Dim retValAsObjAsDateTime = CType(retValAsObj, DateTime) 
     Dim retValWithSpecifiedKind = DateTime.SpecifyKind(retValAsObjAsDateTime, DateTimeKind.Utc) 
     retVal = CType(CType(retValWithSpecifiedKind, Object), T?) 
    End If 
    Return retVal 
End Function 

私は何かが足りないのですか?このような簡単な作業のために4回キャスティングすることは、私にとっては最高の/最も簡単な解決策であると思われます。

+4

このようなコードを記述すると、電球が点灯するはずです。*これは一般的なものではありません。そのようなコードはちょっと避けられない結果をもたらし、ちょうど複雑で苦痛を与えます。 Option Strict Offを使用し、 'As Object'を先読みしている限り、vb.netのダイナミックな型指定に対する適切なサポートを利用することを検討してください。 –

答えて

0

拡張メソッドを使用できます
拡張メソッドでは、タイプをチェックしてキャストする必要はありません。

Dim sanitizedDate As Date? = receivedDate.Sanitize() 
Dim sanitizedAmount As Integer? = receivedAmount.Sanitize() 

拡張メソッドを持っているコードのどこかで

<Extension> 
Public Shared Function Sanitize(Date? nullable) AS Date? 
{ 
    If nullable.HasValue = False Then Return nullable 
    Return DateTime.SpecifyKind(nullable.Value, DateTimeKind.Utc) 
} 

<Extension> 
Public Shared Function Sanitize(Integer? nullable) AS Integer? 
{ 
    If nullable.HasValue = False Then Return nullable 
    If nullable.Value < 0 Then Return 0 
    Return nullable.Value 
} 

「読める」構文あなたが持っているだろう拡張メソッドで
を維持するために、単純な - 拡張メソッドで
あなたはすべてのタイプのための独自の方法を持っていますいくつかの欠点があります。たとえば、単体テストのためにそれらを "模擬"することができない場合、使用するたびに(テスト - ファーストアプローチを使用している場合) "サニタイズ"メソッドをテストする必要があります。

関連する問題