You are on page 1of 3

Usando Reflection en C#

Reflection es una tecnica, se podria decir, para poder extraer la metadata de nuestras clases dentro de una assembly, por ejemplo, teniendo una clase llamada Persona, asumiendo que yo no se que propiedades tiene esta clase solo se el nombre, utilizando reflections puede obtener una lista de todas las propiedades que posee esta clase y asi mismo obtener sus valores.En el .net Framework, las clases de reflection se encuentran dentro del namespace System.Reflection.

Que es metadata?
Meta data es la descripcion sobre nuestros datos, por ejemplo, en una base de datos podemos tener una columna en nuestra tabla, y luego tener la descripcionq ue dice que es la columna, en este caso la metadata seria la descripcion de nuestra columna.

Para que sirve?


Bueno muchos de los frameworks usan reflection y ni nos damos cuenta, sirve en casos de uso donde se necesita automatizar ciertas actividades. Un caso de uso comun es el mapeo de valores, a continuacion un ejemplo:
class Program { static void Main(string[] args) { var atributosPersona = new Dictionary<string ,STRING>(); atributosPersona.Add("Nombre","Roberto Javier"); atributosPersona.Add("Apellido","Yudice"); var persona = new Persona(); foreach (var atributo in atributosPersona) { PropertyInfo propertyInfo = persona.GetType().GetProperty(atributo.Key); propertyInfo.SetValue(persona,atributo.Value,null); } Console.WriteLine("Nombre Persona: {0}",persona.Nombre); Console.WriteLine("Nombre Persona: {0}",persona.Apellido); } } internal class Persona { public String Nombre { get; set; } public String Apellido { get; set; } }

El resultado del codigo de arriba es el siguiente:

Como podran ver, asigne valores a las propiedades de mi clase dinamicamente.

Explicacion
Bueno primero que nada creo una diccionario que contiene el nombre de la propiedad de mi clase y el valor que le quiero asignar. Luego hago un foreach que recorrera cada uno de los elementos del diccionario. Dentro del foreach ocupo persona.GetType() para obetener el tipo de mi clase. Esto es muy importante y es el corazon de Reflection, siempre que quieran utilizar reflection lo primero es obtener el tipo de su objeto. La clase Type contiene todo el conjunto de metadatos de la clase, por ejemplo, sus propiedades, sus metodos, atributos, etc. Para obtener el tipo de un objeto hay diferentes maneras, las mas comunes son: La funcion GetType, es uan funcion que tiene cualquier variable y retorna un objeto Type. Si solo saben el nombre de la clase y no tienen ningun objeto de ese tipo instanciado pueden usar typeof(Persona), donde Persona es el nombre de su clase. Sobre el objeto Type de mi clase persona, llamo el metodo GetProperty el cual lleva como parametro el nombre de mi propiedad y retorna un objeto PorpertyInfo, que como su nombre lo dice, es la metadata sobre la propiedad. Con este mismo objeto podemos asignarle un valor a la propiedad de un objeto. Ya una ves tengo mi objeto PropertyInfo, utilizo la funcion SetValue la cual lleva como parametro primero la instancia del objeto al que le quiero asignar el valor a la propiedad y segundo el valor que deseo asignar. El ultimo parametro que va null es para asignar valores a propiedades indexadas, en palabras simples, en el valor que va dentro de [] en un array, en mi caso mi propiedad no es indexada, por eso le mando null.

El Mito de reflection
Hay una creencia de que usar reflection es lento, la verdad es que quizas lo fue alguna ves pero con los procesadores actuales y avances en la arquitectura de las plataformas como .NET el costo de usar reflection es minimo, muchos frameworks lo usan como ASP.NET MVC, NHibernate, entre otros.

You might also like