/// <summary> /// Método que genera los Getters 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étodoGetDinámico).</returns> public static IPropertyGetterDictionary GetPropertyGetters(Type type, bool cache) { //Si los Getters ya habian sido creados se devuelven PropertyGetterDictionary getters = GetGettersFromCache(type); if (getters != null) { return(getters); } //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 Get obtenido por reflection Dictionary <string, PropertyGetter> internalGetters = new Dictionary <string, PropertyGetter>(props.Length); foreach (PropertyInfo pi in props) { //Obtenemos en 'setter' el método Get dinámico para el atributo o propiedad 'pi'. PropertyGetter getter = GetPropertyGetter(pi); if (getter != null) { internalGetters.Add(pi.Name.ToLower(), getter); } } getters = new PropertyGetterDictionary(internalGetters); if (cache) { AddGettersToCache(getters, type); } return(getters); }
/// <summary> /// Añade a la caché los Getters de un tipo determinado por itemType. /// </summary> /// <param name="getters">Diccionario de Getters a guardar en caché.</param> /// <param name="itemType">Tipo del objeto que contiene el diccionario.</param> private static void AddGettersToCache(PropertyGetterDictionary getters, Type itemType) { HttpRuntime.Cache["PropertyGetters_" + itemType.FullName] = getters; }