This page looks best with JavaScript enabled

Objetos anónimos como diccionarios

 ·  ☕ 2 min  ·  ✍️ eiximenis

Nota: Este post ha sido importado de mi blog de geeks.ms. Es posible que algo no se vea del todo "correctamente". En cualquier caso puedes acceder a la versión original aquí

¡Hola!

Cada vez más existen frameworks y librerías que permiten usar objetos anónimos como si de diccionarios se tratase. Esto es muy cómodo porque permite realizar llamadas tal y como:

Foo(new { x = 10, y = 20, Data = "Data" });

[][1]

Por ejemplo, en ASP.NET MVC no se paran de hacer llamadas parecidas a esta…

Internamente el método Foo utilizará reflection para iterar sobre las propiedades del objeto anónimo que recibe y obtener los datos.

Si tenéis varios métodos que trabajan con IDictionary<string, T> y queréis que se puedan llamar fácilmente usando esta técnica podéis crear un método extensor de IDictionary<string, T> que rellene un diccionario a partir de las propiedades de un objeto… De acuerdo, vuestros métodos no serán invocables directamente pasándoles un objeto anónimo pero al menos los diccionarios se crearán mucho más fácilmente.

Si estáis vagos aquí tenéis un código que uso yo para esto:

public static class DictionaryStringStringExtensions
{
    public static IDictionary<string, T>  FillFromObject<T>(
        this IDictionary<string, T> dictionary,
        object values)
    {
        if (values == null) return dictionary;
        Type type = values.GetType();
        foreach (var property in type.GetProperties())
        {
            if (!dictionary.ContainsKey(property.Name))
            {
                object propValue = property.GetValue(values, null);
                T finalValue = default(T);
                if (property.PropertyType.Equals(typeof(T)))
                {
                    finalValue = (T)property.GetValue(values, null);
                }
                else
                {
                    finalValue = (T)Convert.ChangeType (propValue,
                        typeof(T),  CultureInfo.CurrentCulture);
                }
                dictionary.Add(property.Name, finalValue);
            }
        }
        return dictionary;
    }
}

El método realiza conversiones básicas entre tipos de propiedades… Así podeis inicializar fácilmente vuestros diccionarios:

var d = new Dictionary<string, int>();
d.FillFromObject(new { col = "10", row = 20.2 });

Saludos!

Si quieres, puedes invitarme a un café xD

eiximenis
ESCRITO POR
eiximenis
Compulsive Developer