Reflection con VB.Net (I): Instanciar objetos
En algunas ocasiones, podemos querer crear objetos de forma dinámica, de forma que no necesitemos conocer el nombre de la clase a instanciar durante el desarrollo. Para ello, podemos utilizar las clases del namespace Reflection.Vamos a realizar un ejemplo en el que queremos instanciar una clase de la que no conocemos el nombre, y que dicha clase tiene que ejecutar un método X que devolverá un resultado en una propiedad Y. Definimos un formulario web con 5 textBox y un botón:
- txtLibreria: dónde se encuentra la clase.
- txtClase: nombre de la clase a instanciar
- txtMetodo: nombre del método a ejecutar
- txtPropiedad: propiedad que contiene el resultado
- txtResultado: mostrará el resultado obtenido
- btnEjecutar: ejecuta el método
- El método no tiene parámetros
- La propiedad que contiene el resultado es de tipo String
En el evento onClick del botón, insertamos el siguiente código:
En siguientes entregas, veremos la forma de llamar a un método con parámetros, y de obtener toda la información de una clase.
Dim
objectType As Type = Type.GetType(txtLibreria.Text + "." + txtClase.Text + ", " + txtLibreria.Text, True) Dim myObject As Object = Activator.CreateInstance(objectType) ' Crea la instancia del objeto Dim mi As Reflection.MethodInfo = myObject.GetType().GetMethod( txtMetodo.Text) mi.Invoke(myObject, Nothing) ' Invoca al método (sin parámetros)
Dim pi As Reflection.PropertyInfo = myObject.GetType.GetProperty( txtPropiedad)
Dim strResultado As String = pi.GetValue(myObject, Nothing) ' Recupera el valor de la propiedad
txtResultado.Text = strResultado
Referencias:
- Grupos Google: http://groups.google.com/group/microsoft.public.dotnet.framework.compactframework/browse_thread/thread/668c115b28857b49/10cea7f28e039c35?lnk=st&q=System.Reflection.Assembly.GetExecutingAssembly+Type.GetType&rnum=8#10cea7f28e039c35
- El Guille: http://www.elguille.info/NET/dotnet/reflectioninfotipo.htm
- Microsoft: http://msdn2.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx