/// <summary> /// Método que genera los setters de un determinado tipo de objeto (clase) y los /// devuelve en un diccionario que contiene todas las propiedades de la clase /// junto con los métodos creados dinámicamente. /// </summary> /// <param name="type">Tipo (Clase) del que se obtendran las propiedades.</param> /// <param name="cache">Si es true, el Diccionario creado se alamacenará en caché, /// en caso contrario, no se almacenará en caché.</param> /// <returns>Diccionario de duplas (NombrePropiedad, MétodoSetDinámico).</returns> public static IPropertySetterDictionary GetPropertySetters(Type type, bool cache) { //Si los Setters ya habian sido creados se devuelven. PropertySetterDictionary setters = GetSettersFromCache(type); if (setters != null) { return(setters); } //Lo primero obtengo las propiedades de ese tipo (clase). //Cada PropertyInfo contiene el tipo y el nombre de una propiedad de la clase (type). PropertyInfo[] props = type.GetProperties(); //Diccionario en el que la clave es el Nombre de la propiedad y el valor el método Set obtenido por reflection Dictionary <string, PropertySetter> internalSetters = new Dictionary <string, PropertySetter>(props.Length); foreach (PropertyInfo pi in props) { //Obtenemos en 'setter' el método set dinámico para el atributo o propiedad 'pi'. PropertySetter setter = GetPropertySetter(pi); if (setter != null) { internalSetters.Add(pi.Name, setter); } } setters = new PropertySetterDictionary(internalSetters); if (cache) { AddSettersToCache(setters, type); } return(setters); }
/// <summary> /// Añade a la caché los setters de un tipo determinado por itemType. /// </summary> /// <param name="setters">Diccionario de Setters a guardar en caché.</param> /// <param name="itemType">Tipo del objeto que contiene el diccionario.</param> private static void AddSettersToCache(PropertySetterDictionary setters, Type itemType) { HttpRuntime.Cache["PropertySetters_" + itemType.FullName] = setters; }