Instanciar clase dinamicamente

En C# podemos crear instancias de clases provenientes de ensamblados que no están referenciados en el proyecto desde la construcción.

Para demostrar esta característica crearemos un proyecto con un formulario que solicite el monto de una compra e indique cual (DLL, Clase y Método) será el encargado de calcular el descuento a otorgar.

clip_image001

Otro proyecto tipo librería de clase expondrá las dos clases (VIP y Normales)

clip_image003

(Aunque estén en la misma solución no existe referencia)

 

Esto nos permite cambiar y compilar la DLL sin alterar el proyecto “Consumidor”. Cada vez que cambiemos las reglas de cálculo copiamos el ensamblado resultante al lado del ejecutable y este será consumido por Reflection.

A continuación el código que contendrá cada una de las clases para las reglas de descuentos.  Ellas son parte de Reglas.dll

namespace Reglas
{
    public class VIP
    {
        public static int CalcularDescuento(int monto)
        {
            //Estas operacion son la que suponemos tendran 
            //cambios muy drasticos frecuentemente.
            return (monto * 15 / 100);
        }
    }
}

namespace Reglas
{
    public class Normales
    {
        public static int CalcularDescuento(int monto)
        {
            //Estas operacion son la que suponemos tendran 
            //cambios muy drasticos frecuentemente.
            return (monto * 10 / 100);
        }
    }
}

A continuación la carga dinámica desde el formulario.

    private void btnEjecutar_Click(object sender, EventArgs e)
        {
            int m_monto = Convert.ToInt32(txtMonto.Text);
            
            //Cargamos el ensamblado
            Assembly m_assembly = Assembly.LoadFrom(txtDLL.Text);
            //Obtenemos el tipo de la clase
            Type m_type = m_assembly.GetType(txtType.Text);
            //creamos la instancia
            object m_clase = Activator.CreateInstance(m_type);
            //Cargamos el metodo solicitado
            MethodInfo m = m_clase.GetType().GetMethod(txtMetodo.Text);
            
            object[] m_parametros = {m_monto};
            //Pasamos los parametros al metodo y lo ejecutamos
            object m_descuento =  m.Invoke(null,m_parametros);
 
            lblResultado.Text = "Descuento de: " + m_descuento.ToString();
        }

En ejecución:

clip_image004 Clase Normales, resultado 200

clip_image005Clase VIP, resultado 300

Esto es una muy poderosa herramienta que nos permite crear un gran nivel de desacoplamiento cuando sea requerido.

Espero puedan sacarle provecho es una alternativa para manejar motores de reglas de negocio con un poco más de programación pueden lograr obtener versiones de reglas y mayor personalización. Ejemplo reglas que entran en vigencia por 4 horas.

Como siempre el link del proyecto:

http://dl.dropbox.com/u/26490398/c/nplanchart.wordpress.com_DinamicClassIns.zip  Thumbs up

4 Respuestas a “Instanciar clase dinamicamente

  1. Que tal Norberto buen dia, oye una pregunta con respecto a este ejemplo, tu tienes cargada la libreria que vas a instanciar dinamicamente(Reglas), y quiero pensar que cuando corres la aplicacion, se compilan los 2 proyectos, pero que pasa si la clase que quiero instanciar dinamicamente esta en otro assembly ajeno a esta solución..

    1. ¿Puedo copiar la dll al proyecto e instancia una clase de esa dll dinamicamente?

    Saludos Cordiales

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