DEV Community

Cover image for Llamado dinámico de una clase en C#
Sergio Martinez
Sergio Martinez

Posted on

Llamado dinámico de una clase en C#

Hola a todos, espero que disfruten el siguiente mini tutorial 🦖

Aveces tenemos una configuración de un sistema, ya sea por base de datos o algún archivo de configuración.

Dependiendo de esta configuración el comportamiento del programa en su implementación puede cambiar mucho y como nosotros somos programadores elegantes 😎 no queremos hacer un switch case de implementación de interfaces, llamamos el objeto de nuestra configuración y voila 🤗.

Un ejemplo mundo real que estoy aplicando esto es para un bot de trading donde la configuración apunta a realizar operaciones en diferentes exchanges, cada exchange maneja diferentes apis, reglas de negocio e implementaciones, por lo cual esta técnica es sumamente útil.


Voy a plantear la siguiente situación hipotética, viajar, podemos viajar de muchas formas!

Desde un archivo json en nuestro ejemplo podemos, configurar el medio de transporte (avión, pie, carro y trén).

Para poner un poco de orden al caos de llamar objetos sin conexión, implementamos una interfaz la cual deben cumplir todos los objetos

Diagrama de interfaz e implementacion

Para facilitar la lectura de un objeto json, usaremos la librería newton soft.
El proyecto en su estructura quedaría así

Estructura

Archivo de configuración Config.json

{
"Medio":  "Pie"
}
Enter fullscreen mode Exit fullscreen mode

interface Iviajar

namespace LlamadoDinamico
{
    //Marco de referencia que deben cumplir los diferentes medios de viaje
    public interface Iviajar
    {
        bool ComienzoViaje(string destino);
    }
}
Enter fullscreen mode Exit fullscreen mode

Programa principal

/***
 * Ejemplo de como invocar una clase dinámicamente por medio de una configuración almacenada en un archivo
 * de configuración
 ***/

using LlamadoDinamico;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;


string configPath = Directory.GetCurrentDirectory() + @"\Config.json";

if (File.Exists(configPath))
{
    //Obtención en bruto del archivo a texto
    string textConfiguration = File.ReadAllText(configPath);
    //de string a Jobject
    dynamic data = JObject.Parse((string)textConfiguration);
    string medio = data["Medio"];
    //se incluye la ruta del namespace completo más la clase
    string strclase = "LlamadoDinamico.FormasdeViaje." + medio;
    Iviajar viajar = (Iviajar)System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(strclase);
    bool resultado = viajar.ComienzoViaje("FarFaraway!");
    Console.ReadLine();
}
Enter fullscreen mode Exit fullscreen mode

Implementación de una de las forma de viaje
Pie.cs

namespace LlamadoDinamico.FormasdeViaje
{
    public class Pie : Iviajar
    {
        public bool ComienzoViaje(string destino)
        {
            bool respuesta = false;
            if (destino == "FarFaraway!")
            {
                Console.WriteLine("voya pie y está muy lejos, usa otro medio de transporte");
            }
            else 
            {
                Console.WriteLine("Andando ando!");
                respuesta = true;
            }
            return respuesta;
        }
    }
}

Enter fullscreen mode Exit fullscreen mode

Baja el ejemplo completo acá
https://github.com/sergiotechx/LlamadoDinamico

Espero que te haya sido de utilidad 😁 y a seguir con toda la energía positiva en tu proyecto, que eso no se hace sólo 💪

Top comments (0)