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

11 comentarios en “Reflection en .NET

  1. Usando un lenguaje de tipado dinámico en .NET , se pueden acceder a las propiedades y métodos en tiempo de ejecución sin la necesidad de Reflexion. Incluso se pueden crear propiedades en tiempo de ejecución para los objetos. Lástima que Microsoft hace unas pocas semanas haya abandonado el trabajo en estos lenguajes y ahora los empleados de Microsoft que trabajaban en estos proyectos sólo los continuen en su tiempo libre como proyectos open source

    • Es cierto eso que decís, pero de todas formas no te olvides que el tipo de datos dinámico recién aparece en la versión 4 del framework .NET … por lo tanto hay que rebuscarse de otras formas en versiones anteriores 🙂

      • Me estoy leyendo todo tu blog que está muy bueno y aparte me ayuda a entender cosas que en blogs en inglés no entendía 🙂

        Bueno, obviamente que vos escribiste este articulo haciendo referencia a C#, que es un lenguaje oficial de Microsoft para .NET y el más difundido de todos porque fue hecho para .NET y nació con .NET. 🙂

        El tipo de datos dinámico fue introducido para .NET 4.0 para ser usado por C# , pero el tipado dinámico se puede usar con .NET 3.5 con lenguajes como IronPython o IronRuby (y creo que hay por lo menos otros 2 lenguajes más que nunca probé).

        Nosotros usamos IronPython porque el lenguaje es muy versátil, te da mucha libertad y es menos verboso, aparte hace muy facil la metaprogramación que te permite generar programas que generen código dinámicamente y escribir menos código todavía y el código se regenere solo tras ciertas modificaciones, y en su momento era el unico lenguaje de tipado dinámico compatible con asp.net. El problema con estos lenguajes es que son “proyectos” y si bien antes habia gente de Microsoft trabajando en estos ahora sólo lo hacen como hobbie, se pueden encontrar errores en los IDE, en modulos originales del lenguaje (encontré algunos en el modulo copy por ejemplo, al tratar de compilar con ciertas opciones, o al tratar de usar lenguajes de tipado dinamico y lenguajes estaticos juntos para asp.net (como IronPython con VB.NET o C#, a la parte de compatibilidad con asp.net la tienen casi olvidada, pero buscandole la vuelta se pueden usar estáticos y dinámicos juntos para asp.net) si bien cuando reportas los errores los corrigen rápido o te indican como corregirlos (porque es opensource) o te dan alguna alternativa) Algo que tienen muy bueno es que te extienden tus librerias, puedes usar las librerias originales de los lenguajes aparte de las de .NET y hasta puedes a un objeto aplicarle un metodo de .net y luego al resultado uno de otro lenguaje!

        **Creo que el tipo dinámico para C# surgió porque Jim Hugunin (el creador de Jython y IronPython) creo un componente para .NET llamado DLR (Dynamic Language Runtime) sobre la que corren los lenguajes dinámicos en .NET, y lo hizo después de la version 1.0 de IronPython, porque la versión 1.0 de IronPython manejaba muy mal algunas cosas como la administración de memoria, entonces creo ese componente para Microsoft para ser usado por IronPython 2.0, y luego Microsoft utilizó este componente para darle cierta capacidad de tipado dinámico a C# 4.0 .

      • Gracias por la data Pablo, la verdad es que nunca trabajé con esos lenguajes… cosa que tengo pendiente todavía, así que cualquier día me invitas unos mates y me enseñas sobre el tema!

        Leí por ahí también eso que me comentabas, que la gente de MS dejo de darle soporte a lenguajes como IronRuby e IronPython, lo cual puso de muy mal humor a mucha gente (incluido a vos jajaja)!

  2. Si, por eso te pregunté en Twitter cual eran las características de tipado para C# . Nosotros a C# no lo usamos mucho (mal que hacemos) y como sólo leí que C# 4.0 tiene “ciertas características de tipado dinámico” quería saber si tenía las que a mí realmente me interesan. Si en versiones futuras de .NET surgen características que sería bueno que los lenguajes Iron las aprovechen y no se aprovechan porque los lenguajes Iron no se actualizan más, voy a tener que mudar un pequeño framework hecho en IronPython a otro lenguaje que me permita hacer las mismas cosas.

    Pero uno de los coordinadores de los proyectos Iron es un programador de un libro que leí, que tienen que seguir actualizando si o si los lenguajes Iron porque su compania tiene una planilla de calculo a la venta como principal producto hecha en IronPython (y aparte como programa de escritorio). Esos si que tienen un problema! jajaja

  3. Ah, ustedes que trabajan a full con C#, Miguel de Icaza, que fue elegido por la revista “Times” como uno de los 100 mejores innovadores tecnológicos para el siglo 21, que hizo el compilador de C# para Linux, y que es uno de los coordinadores de los proyectos Iron y tambien es Microsoft MVP, está por liberar un borrador para un nuevo lenguaje de código abierto al que por ahora llaman “#S”, que va a ser un “lenguaje muy parecido a C# pero con las características extras que siempre quisimos para C#”

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