我有以下方法:
public static T Get<T>(this DbDataReader reader, int ordinal, Func<T> @default)
{
if(reader.IsDBNull(ordinal))
return @default();
return reader.GetFieldValue<T>(ordinal);
}
当我尝试用T=DateTime
调用它时,我得到以下异常:
System.InvalidCastException was unhandled by user code
HResult=-2147467262
Message=Specified cast is not valid.
Source=System.Data
StackTrace:
at System.Data.Common.DbDataReader.GetFieldValue[T](Int32 ordinal)
...
该方法似乎适用于其他类型,如字符串和数字类型。通用GetFieldValue<T>
方法根本不适用于日期,还是我在这里做错了什么?
我已经通过使用特定的DateTime
方法处理GetDateTime
案例来修复它,但仍然想知道我是否能够以某种方式摆脱这种烦人的黑客攻击。
public static T Get<T>(this DbDataReader reader, int ordinal, Func<T> @default)
{
if(reader.IsDBNull(ordinal))
return @default();
switch(Type.GetTypeCode(typeof(T)))
{
case TypeCode.DateTime:
return (T)(object)reader.GetDateTime(ordinal);
default:
return reader.GetFieldValue<T>(ordinal);
}
}