public static List <object> CreateControllableDevices(JToken deviceTypesJson) { SerialBlaster serialBlaster = null; var devices = new List <object>(); //For each device foreach (var deviceTypeJson in deviceTypesJson) { string deviceTypeAsString = ((JProperty)deviceTypeJson).Name; //Get the constructor and parameters for the class were going to create (e.g AtenVS0801H) Type deviceType = Type.GetType($"ControllableDevice.{deviceTypeAsString}, ControllableDevice"); var constructor = deviceType.GetConstructors()[0]; var parameterInfos = constructor.GetParameters(); // For each instance of the device settings foreach (var deviceSettingsJson in deviceTypeJson.First()) { var parameters = new List <object>(); //For each paramter, either manager the cast or assignment explicitly by type, or rely on an explicit cast foreach (var parameterInfo in parameterInfos) { Type type = parameterInfo.ParameterType; string value = ((JValue)deviceSettingsJson[parameterInfo.Name])?.Value.ToString(); switch (type) { case Type _ when type == typeof(SerialBlaster): Debug.Assert(serialBlaster != null, $"SerialBlaster has not been initialised but is required for construction of {deviceType.Name}."); parameters.Add(serialBlaster); break; case Type _ when type == typeof(IPAddress): parameters.Add(IPAddress.Parse(value)); break; case Type _ when type == typeof(PhysicalAddress): parameters.Add(PhysicalAddress.Parse(value)); break; default: //Default is to rely on an explicit case parameters.Add(Convert.ChangeType(value, parameterInfo.ParameterType)); break; } } var device = constructor.Invoke(parameters.ToArray()); if (device.GetType() == typeof(SerialBlaster)) { serialBlaster = (SerialBlaster)device; } devices.Add(device); } } return(devices); }
public static OSSC CreateDevice(SerialBlaster serialBlaster) { return(new OSSC(serialBlaster)); }