I have a series of Extension methods to help with null-checking on IDataRecord objects, which I’m currently implementing like this:
public static int? GetNullableInt32(this IDataRecord dr, int ordinal) { int? nullInt = null; return dr.IsDBNull(ordinal) ? nullInt : dr.GetInt32(ordinal); } public static int? GetNullableInt32(this IDataRecord dr, string fieldname) { int ordinal = dr.GetOrdinal(fieldname); return dr.GetNullableInt32(ordinal); }
and so on, for each type I need to deal with.
I’d like to reimplement these as a generic method, partly to reduce redundancy and partly to learn how to write generic methods in general.
I’ve written this:
public static Nullable<T> GetNullable<T>(this IDataRecord dr, int ordinal) { Nullable<T> nullValue = null; return dr.IsDBNull(ordinal) ? nullValue : (Nullable<T>) dr.GetValue(ordinal); }
which works as long as T is a value type, but if T is a reference type it won’t.
This method would need to return either a Nullable type if T is a value type, and default(T) otherwise. How would I implement this behavior?
You can just declare your method like this:
This way, if T is a nullable int or any other nullable value type, it will in fact return null. If it’s a regular datatype, it will just return the default value for that type.