我做了一個轉換方法來處理procs返回的數據庫值。它看起來像這樣:直接拆箱盒int到
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;
//Trata valores de enuns nuláveis. Um cast direto de um tipo numérico (Int32, por exemplo)
//para um valor de enum lança uma exception InvalidCastException.
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
//becouse 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'平均引用類型 - >值類型 – sll
這是發生了什麼:'value'變量,這是一個'object',包含一個'int'。然後我把它投向一個「短」。是不是'拆開'變量的'int'值? – Raphael
@Raphael:好的,但是在這種情況下,你可以擴展標題,因爲它真的讓''unboxing int'變成short',就像'object(int) - > short'一樣。 – sll