It seems that I have encountered a scenario where many aspects of C# 2.0+ come into play.  I needed to handle conversion from an IDataReader.GetValue() result to a generic type, including Nullable<>.  It took me a while to figure it out and with a little help from this snippet, I was quite please with the result.  So, I decided to share.

   1: private static T NullValue<T>( object testValue, T nullValue )
   2: {
   3:     T returnValue;
   4:     if( testValue is DBNull )
   5:     {
   6:         returnValue = nullValue;
   7:     }
   8:     else if( typeof(T).GetGenericTypeDefinition().Equals( typeof(Nullable<>) ) )
   9:     {
  10:         returnValue = (T)Convert.ChangeType( testValue, Nullable.GetUnderlyingType( typeof(T) ) );
  11:     }
  12:     else
  13:     {
  14:         returnValue = (T)Convert.ChangeType( testValue, typeof(T) );
  15:     }
  16:     return returnValue;
  17: }

It turns out that System.Decimal cannot be converted directly to Nullable<Int32>.  However, it can be converted to Int32, which can be converted to Nullable<Int32>.  I guess the transitive property doesn't apply to type conversion.

posted on Tuesday, March 4, 2008 11:26 PM
Filed Under [ .Net Database Productivity C# ]


# re: Generic Conversion for DBNull and Nullable types
posted by JimLad
on 11/18/2010 12:08 PM
VB version:
Friend Shared Function CTypeDBNull(Of T)(ByVal testValue As Object, ByVal replacementNullValue As T) As T
Dim returnValue As T
If (IsDBNull(testValue)) Then
returnValue = replacementNullValue
ElseIf (GetType(T).GetGenericTypeDefinition().Equals(GetType(Nullable(Of )))) Then
returnValue = CType(Convert.ChangeType(testValue, Nullable.GetUnderlyingType(GetType(T))), T)
returnValue = CType(Convert.ChangeType(testValue, GetType(T)), T)
End If
Return returnValue
End Function

Post A Comment