Reflection en .NET

Muchas veces necesitamos consultar que propiedades o métodos tiene un objeto en tiempo de ejecución. El framework .NET nos provee una forma de poder acceder a esta información, y la misma se encuentra dentro del namespace System.Reflection.

MSDN lo define de la siguiente manera:

Reflexión proporciona objetos (de tipo Type) que encapsulan ensamblados, módulos y tipos. Se puede utilizar la reflexión para crear dinámicamente una instancia de un tipo, enlazar el tipo a un objeto existente u obtener el tipo a partir de un objeto existente, e invocar sus métodos o tener acceso a sus campos y propiedades.

Por ejemplo, supongamos que tenemos definida la clase Cuenta:

public class Cuenta
{
    public Cuenta()
    {
        this.Saldo = 0;
    }

    public int Numero { get; set; }
    public decimal Saldo { get; set; }

    public void Depositar(decimal monto)
    {
        this.Saldo += monto;
    }
}

Para poder obtener información acerca de la clase, lo primero que vamos a hacer es crear una instancia de la misma y luego utilizando el método GetType() accederemos al método GetProperties() que nos retornará un array de objetos System.Reflection.PropertyInfo. Como se van imaginando, ese arreglo es el que posee información acerca de las propiedades de nuestra clase:

Cuenta cuenta = new Cuenta();
PropertyInfo[] propiedades = cuenta.GetType().GetProperties();

foreach (PropertyInfo propiedad in propiedades)
{
   Console.WriteLine(string.Format("Propiedad {0} >> {1}", propiedad.Name, propiedad.PropertyType));
}

Console.ReadLine();

Pero también podemos conocer que métodos que tenemos disponibles en la clase. Esto por medio del método GetMethods() que nos devolverá un array de objetos System.Reflection.MethodInfo:

MethodInfo[] metodos = cuenta.GetType().GetMethods();

foreach (MethodInfo metodo in metodos)
{
    Console.WriteLine(string.Format("Método {0}", metodo.Name));
}

Console.ReadLine();

Lo que obtendriamos de ambos ejemplos es algo similar a esto:

Ejemplo reflection

Además de las propiedades y métodos, podemos tener acceso a mucha más información, como por ejemplo los eventos, constructores, campos… y mucho más que podemos ver aquí. Otra cosa que nos permite Reflection es obtener u asignar valores de las propiedades o campos:

Cuenta cuenta = new Cuenta();
PropertyInfo[] propiedades = cuenta.GetType().GetProperties();

// Obtengo el valor de la propiedad saldo.
object saldo = cuenta.GetType().GetProperty("Saldo").GetValue(cuenta, null);
Console.WriteLine(saldo);

// Seteo el valor a la propiedad saldo.
object nuevoSaldo = 100m;
cuenta.GetType().GetProperty("Saldo").SetValue(cuenta, nuevoSaldo, null);
Console.WriteLine(cuenta.Saldo);

Espero que les sea de utilidad!

Anuncios