从'System.Double'到'System.Nullable`的转换无效

时间:2013-11-06 11:59:40

标签: c# data-conversion

我有以下基于此初始Generic function to handle DataType Conversion

的功能
public static T ConvertFromDB<T>(object value)
{
  return value == DBNull.Value ? default(T) : (T)Convert.ChangeType(value, typeof(T));
}

工作正常。但是当传入像0这样的双精度时,我得到以下异常;

  

从'System.Double'转换为无效   'System.Nullable`1 [[System.Double,mscorlib,Version = 4.0.0.0,   Culture = neutral,PublicKeyToken = b77a5c561934e089]]'。

我尝试过像一个浮动但是仍然一样。任何想法为什么会发生这种情况?

1 个答案:

答案 0 :(得分:11)

简单地说:这不是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,因此不需要做这些事情(同样:他们会做得更好,通过考虑元编程代码中的类型转换,而不是每值执行代码。