コード例 #1
0
        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);
        }
コード例 #2
0
 public static OSSC CreateDevice(SerialBlaster serialBlaster)
 {
     return(new OSSC(serialBlaster));
 }