Llamado dinámico de una clase en C#
Published: 2022-09-06 16:51:53

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f0rnvyqf1uufmdnz9rap.png)

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

![Estructura](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mubb9nzubpvt8qxvvte.png)


Archivo de configuración Config.json
```
{
"Medio":  "Pie"
}
```
interface Iviajar

```
namespace LlamadoDinamico
{
    //Marco de referencia que deben cumplir los diferentes medios de viaje
    public interface Iviajar
    {
        bool ComienzoViaje(string destino);
    }
}
```
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();
}
```
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;
        }
    }
}

```

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 💪