que tienen una serie de métodos de extensión para ayudar con nula comprobación en objetos IDataRecord, que estoy actualmente de aplicación como esta:¿Puede un método genérico manejar los tipos de valores de referencia y valores anulables?
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);
}
y así sucesivamente, para cada tipo tengo que tratar.
Me gustaría volver a implementar esto como un método genérico, en parte para reducir la redundancia y en parte para aprender a escribir métodos genéricos en general.
He escrito esto:
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);
}
que funciona siempre y cuando T es un tipo de valor, pero si T es un tipo de referencia no lo hará.
Este método debería devolver un tipo anulable si T es un tipo de valor y, por defecto, (T). ¿Cómo implementaría este comportamiento?
Es una muy mala solución. Si está en el valor NULL del registro de datos, no desea un valor predeterminado de int. NULL y ZERO son valores diferentes. – TcKs
SI el valor en la base de datos es nulo, entonces el T sería un Nullable en cuyo caso NULL es el valor predeterminado que se devolvería. –
BFree
Si es así, ¿por qué usar este método de extensión, si puede usar simplemente "dr [ordinal] como int?" ? – TcKs