using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using CtrEditor.Simulacion; using System.Reflection; namespace CtrEditor.ObjetosSim { public static class UserControlFactory { public static UserControl? GetControlForType(Type tipoObjeto) { // Obtener el nombre del tipo de objeto string typeName = tipoObjeto.Name; // Cambiar las primeras dos letras de 'os' a 'uc' if (typeName.StartsWith("os")) { string newTypeName = "uc" + typeName.Substring(2); // Obtener el ensamblado donde se encuentra el tipo UserControl Assembly assembly = Assembly.GetExecutingAssembly(); // Buscar el tipo en los ensamblados cargados Type? controlType = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .FirstOrDefault(t => t.Name == newTypeName); if (controlType != null && typeof(UserControl).IsAssignableFrom(controlType)) { // Crear una instancia del tipo encontrado return (UserControl?)Activator.CreateInstance(controlType); } } return null; } public static osBase? GetInstanceForType(Type tipoObjeto) { // Verifica si el tipo pasado es un subtipo de osBase if (!typeof(osBase).IsAssignableFrom(tipoObjeto)) { throw new ArgumentException("El tipo pasado no es un subtipo de osBase", nameof(tipoObjeto)); } // Crear una instancia del tipo especificado return (osBase?)Activator.CreateInstance(tipoObjeto); } public static osBase? CreateInstanceAndPopulate(Type tipoObjeto, string jsonString) { osBase? instance = GetInstanceForType(tipoObjeto); if (instance != null) { // Deserializa los datos desde jsonString y popula la instancia JsonConvert.PopulateObject(jsonString, instance); } return instance; } public static void AssignDatos(UserControl userControl, osBase datos, SimulationManagerFP simulationManager) { if (userControl is IDataContainer dataContainer) { dataContainer.Datos = datos; userControl.DataContext = datos; datos.VisualRepresentation = userControl; datos.simulationManager = simulationManager; } } } }