Generic Conversion for DBNull and Nullable types

Generic Conversion for DBNull and Nullable types

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( 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.  However, it can be converted to Int32, which can be converted to Nullable.  I guess the transitive property doesn't apply to type conversion.

Tags:,,,

This article is part of the GWB Archives. Original Author: Will Smith

New on Geeks with Blogs