Отказ от ответственности: Этот ответ работает, но предназначен только для образовательных целей. :) Решение Джеймса Джонса, вероятно, здесь лучшее, и, конечно, я бы выбрал его.
Ключевое слово
C # 4.0 dynamic
делает это еще проще, хотя и менее безопасным:
public static dynamic GetNullableValue(this IDataRecord record, string columnName)
{
var val = reader[columnName];
return (val == DBNull.Value ? null : val);
}
Теперь вам не нужно указывать явный тип на RHS:
int? value = myDataReader.GetNullableValue("MyColumnName");
На самом деле вам это даже не нужно!
var value = myDataReader.GetNullableValue("MyColumnName");
value
теперь будет int, или строкой, или любым другим типом, который был возвращен из БД.
Единственная проблема заключается в том, что это не мешает вам использовать ненулевые типы в LHS, и в этом случае вы получите довольно неприятное исключение времени выполнения, например:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot convert null to 'int' because it is a non-nullable value type
Как и для всего кода, который использует dynamic
: кодер Caveat.