Llamado din谩mico de una clase en C#

Sergio Martinez Marin - Sep 6 '22 - - Dev Community

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 馃挭

. . . . . . .