我有以下基于此初始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]]'。
我尝试过像一个浮动但是仍然一样。任何想法为什么会发生这种情况?
答案 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,因此不需要做这些事情(同样:他们会做得更好,通过考虑元编程代码中的类型转换,而不是每值执行代码。