.Net Reflection cache

Publiqué una respuesta a una pregunta en Stackoverflow.com, respecto a cachear los resultados de .Net Reflection, específicamente el método GetProperties, para mejorar la performance de una aplicación.

 

Mi respuesta, con código de ejemplo está en: Cache Reflection Results (class properties)

 

Código:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;

namespace C.User.Code
{
public class MapeadorDataReaderListaObjetos
{

private Hashtable properties;

private Hashtable Properties
{
get
{
if (properties == null)
properties = new Hashtable();
return properties;
}

set { properties = value; }
}

private void LoadProperties(object targetObject, Type targetType)
{
var flags = BindingFlags.DeclaredOnly| BindingFlags.Instance| BindingFlags.Public;

if (properties == null)
{
List<PropertyInfo> propertyList = new List<PropertyInfo>();
PropertyInfo[] objectProperties = targetType.GetProperties(flags);
foreach (PropertyInfo currentProperty in objectProperties)
{
propertyList.Add(currentProperty);
}
properties = new Hashtable();
properties[targetType.FullName] = propertyList;
}

if (properties[targetType.FullName] == null)
{
List<PropertyInfo> propertyList = new List<PropertyInfo>();
PropertyInfo[] objectProperties = targetType.GetProperties(flags);
foreach (PropertyInfo currentProperty in objectProperties)
{
propertyList.Add(currentProperty);
}
properties[targetType.FullName] = propertyList;
}
}

public void MapearDataReaderListaObjetos <T> (IDataReader dr, List<T> Lista) where T: new()
{
Type businessEntityType = typeof(T);
List<T> entitys = new List<T>();
T miObjeto = new T();
LoadProperties(miObjeto, businessEntityType);
List<PropertyInfo> sourcePoperties = Properties[businessEntityType.FullName] as List<PropertyInfo>;

while (dr.Read())
{
T newObject = new T();
for (int index = 0; index < dr.FieldCount; index++)
{
string _drCampo = dr.GetName(index).ToUpper();
object _valor = dr.GetValue(index);
string _tipo = _valor.GetType().ToString();
for (int _indice = 0; _indice < sourcePoperties.Count; _indice++)
{
if (sourcePoperties[_indice].Name.ToUpper() == _drCampo)
{
string _tipoProp = sourcePoperties[_indice].PropertyType.ToString();
PropertyInfo info = sourcePoperties[_indice] as PropertyInfo;
if ((info != null) && info.CanWrite)
{
info.SetValue(newObject, _valor, null);
//break;
}
}
}
}
entitys.Add(newObject);
}
dr.Close();
Lista = entitys;
}
}
}

Referencia principal:

A Defense on Reflection in .Net

Otros artículos interesantes al respecto:

Dodge Common Performance Pitfalls to Craft Speedy Applications

Reflection – Slow or Fast? Demonstration with Solutions

Making reflection fly and exploring delegates

Entity Filler: ADO DataReader to entities with reflection

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: