У меня есть ряд методов расширения, чтобы помочь с проверкой нулей на объектах IDataRecord, которые я сейчас реализую следующим образом:
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);
}
и т.д. для каждого типа, с которым мне нужно иметь дело.
Я хотел бы переопределить их как общий метод, отчасти для уменьшения избыточности и отчасти для того, чтобы научиться писать общие методы в целом.
Я написал это:
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);
}
который работает до тех пор, пока T является типом значения, но если T является ссылочным типом, он не будет.
Этот метод должен будет возвращать либо тип Nullable, если T - тип значения, а default (T) в противном случае. Как реализовать это поведение?