lunes, 5 de abril de 2010

Uso de reflection para cargar objetos de nuestra aplicación dinamicamente

Hola!

Vamos allá con nuestra primera entrada.

Muchas veces, por una cosa o por otra, se nos presenta la necesidad de cargar una instancia de un objeto a partir del nombre del mismo, almacenado en un registro de nuestra base de datos o en una variable de cadena. gracias a reflection este trabajo es muy sencillo, y se puede realizar con apenas tres lineas de código, con las que conseguiremos una gran potencia y dinamismo en nuestra aplicación.

En este ejemplo, vamos a usar un nuevo proyecto Windows Forms llamado WindowsApplication1 en el que tenemos por defecto un formulario llamado Form1. Añadimos un nuevo formulario, pulsando con el botón derecho sobre nuestro proyecto en la ventana Explorador de Soluciones, seleccionamos Add (Agregar) y Windows Forms, aparece el cuadro de dialogo Agregar nuevo elemento, y presionamos aceptar.

Una vez que tengamos nuestro nuevo formulario añadido al proyecto, vamos a poner un botón en el formulario Form1 que será el que ejecute nuestro código de Reflection, una vez que tengamos el botón colocado hacemos doble Click sobre el mismo para que nos muestre el codigo del evento Click, donde vamos a poner el siguiente código:

Private Sub Button1_Click(Byval sender as System.Object, Byval e as System.EventArgs) Handles Button1.Click
    Dim strNombreForm as String = "Form2"

    'Codigo Reflection -----------------------
    Dim asmName as System.Reflection.AssemblyName = New System.Reflection.AssemblyName("WindowsApplication1")
    Dim asm as System.Reflection.Assembly = System.Reflection.Assembly.Load(asmName)
    Dim formulario as Form = asm.CreateInstance("WindowsApplication1." + strNombreForm)
    '/Codigo Reflection ----------------------

    formulario.Show()
End Sub

Si ejecutas el proyecto y presionas el botón que hemos colocado en el Form1, verás que se abre una nueva instancia del Form2.

Te explico un poco en detalle las líneas,
1º - Definimos una variable de cadema que contenga el nombre de nuestro Objeto
2º - Creamos una variable de tipo AssemblyName, como parámetro pasamos el nombre de nuestro proyecto, en este caso WindowsApplication1
3º - Creamos una variable de tipo Assembly y cargamos el AssemblyName que creamos en el paso anterior, esto carga una copia de nuestra aplicación en memoria para poder acceder a sus objetos.
4º - Creamos una variable del tipo del objeto que queramos cargar, puede ser un formulario, una clase, un control personalizado, cualquier objeto que pertenezca a nuestra aplicación, la igualamos al resultado del método CreateInstance de la variable Assembly que creamos en el paso anterior, este método toma un solo parámetro donde le indicamos el nombre de nuestro objeto, esto es muy importante, .NET por defecto crea un namespace para nuestro proyecto que se llama igual que el proyecto, en este caso WindowsApplication1, para acceder a un objeto de nuestro proyecto, debemos usar el nombre interno completo que se compone de . por eso especificamos WindowsApplication1. más el nombre guardado en la variable strNombreForm.
5º - Una vez que este método se ha ejecutado nuestra variable formulario contiene una copia exacta de nuestro Form2, por lo que podemos llamar a cualquier método del formulario, como por ejemplo Show.

A continuación os dejo el proyecto de Visual Studio 2008 realizado en este ejemplo.



Espero que sea de utilidad, un gran saludo!

No hay comentarios:

Publicar un comentario