[Tip] Extendiendo TypeConverter para tratar con nulos

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.

2 comentarios en “[Tip] Extendiendo TypeConverter para tratar con nulos”

  1. ¡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 ;-).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *