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 💪

Top comments (0)