6

我有以下基于此初始通用函数的函数来处理数据类型转换

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]] 的无效转换。

我试过铸造成一个浮点数,但还是一样。任何想法为什么会发生这种情况?

4

1 回答 1

17

简单地说:这不是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,所以你不需要做这些事情(另外:他们会做得更好,通过考虑元编程代码期间的类型转换,而不是每个值的执行代码)。

于 2013-11-06T12:03:48.227 回答