Introducción
En este mini post voy a definir un método extensor al tipo TypeConverter para el tratamiento de valores nulos provenientes de la BD.
Al Lio
Como todos sabeis ( y sino muy mal…) un nulo proveniente de la Base de Datos va a ser DbNull.Value (no es el mismo null que en c#), bien para evitar problemas con el uso de TypeConverter, vamos a definir la siguiente extensión:
public static class TypeConverterExtensions
{
public static object ConvertToWithNullableValues(this TypeConverter converter, object value, Type propertyTipe)
{
if ((value == null || value == DBNull.Value))
return null;
if (value.GetType().Equals(propertyType)) return value;
return converter.ConvertTo(value, propertyTipe);
}
}
Un ejemplo de su utilización sería:
reg.GetType().GetProperty(prop.Name).SetValue(reg, converter.ConvertToWithNullableValues(reader[prop.Name], prop.PropertyType), null);
En el ejemplo estoy usando Reflection porque accedo dinamicamente a las propiedades…
Bueno espero que os sea de utilidad.
Saludos!
PD: He añadido una condición más para que si los tipos del objeto y el tipo a convertir coincidan no intente hacer una conversión.
¡Hola máquina!
A ver que te parece esto, si a la vez que extendemos el método aplicamos genéricos…:
public static T ConvertToWithNullableValues(this object value)
{
if ((value == null || value == DBNull.Value)) return default(T);
if (value.GetType().Equals(typeof(T))) return (T)value;
return (T)Convert.ChangeType(value, typeof(T));
}
Y su empleo sería: dr[«Campo»].ConvertToWithNullableValues();
Aunque yo le haría otro cambio más porque necesito que los campos nulos se conviertan en strings vacios por lo que lo dejaría:
public static T ConvertToWithNullableValues(this object value)
{
if ((value == null || value == DBNull.Value))
if (value.GetType().Equals(typeof(string)))
{
return (T)Convert.ChangeType((string.Empty), typeof(T));
}
else
{
return default(T);
}
if (value.GetType().Equals(typeof(T))) return (T)value;
return (T)Convert.ChangeType(value, typeof(T));
}
Que tengas un buen día. Un abrazo y gracias por compartir ;-).
Genial aporte Corsario. 😀