【发布时间】:2011-10-04 13:43:47
【问题描述】:
我已经做了一个转换方法来处理 procs 返回的数据库值。它看起来像这样:
public static T GetVerifiedValue<T>(this IDataRecord record, int index)
{
object value = record[index];
if (value is string)
value = string.IsNullOrEmpty(value as string) ? null : value;
Type nullableUnderlyingType = Nullable.GetUnderlyingType(typeof(T));
if (nullableUnderlyingType != null)
{
if (nullableUnderlyingType.IsEnum)
return value == null || value.Equals(DBNull.Value) ? default(T) : (T)Enum.ToObject(nullableUnderlyingType, value);
}
/*
//This is my try on solving the problem, but won't compile
//because T has no struct constraint
if (value is ValueType)
{
ValueType structValue = (ValueType)value;
return value.Equals(DBNull.Value) ? default(T) : (T)structValue;
}
*/
return value == null || value.Equals(DBNull.Value) ? default(T) : (T)value;
}
问题是当数据库返回一个整数时,value 变量将包含一个int,而当T 是一个short 时,我得到一个InvalidCastException。
如何改进这种方法来处理这种情况?我希望该方法的用户不必担心这种问题,而不必双重施法。这可能吗?
【问题讨论】:
-
不要使用
unboxing术语代替casting,unboxing表示引用类型->值类型 -
这就是正在发生的事情:
value变量,它是一个object,包含一个int。然后我将其转换为short。不是unboxing变量上的int值吗? -
@Raphael:好的,但在这种情况下,你可以扩展标题吗,因为它真的很混乱
unboxing int to short,就像object (int) -> short -
按照@sll 的建议更改了问题的标题。
-
@Icarus:
object是一个引用类型,所以这个是拆箱(object到int)。请参阅here 了解更多信息。之后,将发生从int到short的演员表。
标签: c# .net generics casting unboxing