Я считаю, что вспомогательные методы, такие как следующие, полезны в вашем сценарии - тестирование для DBNull более эффективно, чем перехват исключения, как в вашем примере:
public static MyHelper
{
public static Nullable<T> ToNullable<T>(object value) where T : struct
{
if (value == null) return null;
if (Convert.IsDBNull(value)) return null;
return (T) value;
}
public static string ToString(object value)
{
if (value == null) return null;
if (Convert.IsDBNull(value)) return null;
return (string)value;
}
}
Это работает для строки и обычных типов примитивных значений, с которыми вы столкнетесь (int, decimal, double, bool, DateTime).
Он немного отличается от вашего примера тем, что он скорее преобразует, чем конвертирует, но лично я предпочитаю это. То есть если столбец базы данных имеет значение NUMERIC (десятичное число), я бы предпочел быть явным, если бы я хотел преобразовать значение в int, например ::
int? myIntValue = (int?) MyHelper.ToNullable<decimal>(reader["MyNumericColumn"]);