Недопустимое приведение от System.Double к System.Nullable.


person neildt    schedule 06.11.2013    source источник


Ответы (1)


Просто: это не поддерживаемое использование Convert.ChangeType. Вам нужно придать ему необнуляемую форму, то есть double. Вы можете использовать Nullable.GetUnderlyingType:

return value == DBNull.Value ? default(T) : (T)Convert.ChangeType(value,
      Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T));

но это будет иметь накладные расходы; лично я подозреваю, что может быть проще использовать специальный метод Nullable<T>:

public static T? GetValue<T>(object value) where T : struct
{
    if(value == null || value is DBNull) return null;
    if(value is T) return (T)value;
    return (T)Convert.ChangeType(value, typeof(T));
}

Или еще лучше: используйте ORM или микро-ORM, чтобы вам не нужно было делать все это (также: они сделают это лучше, если подумать о преобразованиях типов во время кода метапрограммирования, а не кода выполнения для каждого значения).

person Marc Gravell    schedule 06.11.2013
comment
Спасибо. Мне придется вызывать как (double)GetValue‹double›(0);, потому что не все возвращаемые типы будут обнуляемыми - person neildt; 06.11.2013
comment
@ Tommo1977 Опять же, может быть желательно иметь разные реализации (разные имена методов), поскольку может иметь значение null, а не значение null, и, возможно, снова разделить для строки. Однако я также повторю, что такие инструменты, как dapper, справятся с этой задачей лучше, чем вы; если это для чтения данных ADO.NET, рассмотрите возможность использования такой библиотеки - person Marc Gravell; 06.11.2013