Mam serię metod rozszerzenie do pomocy przy zerowej sprawdzania na obiektach IDataRecord, które obecnie jestem wykonawczych tak:Czy metoda ogólna może obsługiwać zarówno typy wartości odniesienia, jak i wartości zerowalnej?
public static int? GetNullableInt32(this IDataRecord dr, int ordinal)
{
int? nullInt = null;
return dr.IsDBNull(ordinal) ? nullInt : dr.GetInt32(ordinal);
}
public static int? GetNullableInt32(this IDataRecord dr, string fieldname)
{
int ordinal = dr.GetOrdinal(fieldname);
return dr.GetNullableInt32(ordinal);
}
i tak dalej, dla każdego rodzaju muszę sobie poradzić.
Chciałbym uzupełnić je jako ogólną metodę, częściowo w celu zmniejszenia nadmiarowości, a częściowo, aby nauczyć się pisać ogólne metody w ogóle.
Pisałem to:
public static Nullable<T> GetNullable<T>(this IDataRecord dr, int ordinal)
{
Nullable<T> nullValue = null;
return dr.IsDBNull(ordinal) ? nullValue : (Nullable<T>) dr.GetValue(ordinal);
}
który działa tak długo, jak T jest typ wartości, ale jeśli T jest typem odniesienia nie będzie.
Ta metoda musiałaby zwrócić typ Nullable, jeśli T jest typem wartości, a domyślnie (T) w przeciwnym razie. Jak zaimplementować to zachowanie?
To jest bardzo złe rozwiązanie. Jeśli jest w wartości NULL rekordu danych, nie chcesz wartości domyślnej int. NULL i ZERO są różnymi wartościami. – TcKs
JEŚLI wartość w bazie danych jest zerowalna, wówczas T byłaby Nullable, w którym to przypadku NULL jest wartością domyślną, która zostanie zwrócona. –
BFree
Jeśli tak, dlaczego ta metoda rozszerzenia, jeśli można użyć po prostu "dr [ordinal] jako int?" ? – TcKs