DEV Community

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

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 💪

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →