C# Динамически создать экземпляр класса - PullRequest
0 голосов
/ 24 января 2020

Я нахожусь в ситуации, когда "Я не знаю, чего не знаю" , поэтому я не уверен, что это даже правильный способ решения этой проблемы, извинения, если это произойдет как простой невежественный.

У меня есть программа, которая подключается к контроллерам Ethe rnet. Программа позволяет пользователям настраивать то, что подключено к системе, и настраивать связь ввода / вывода.

Каждый контроллер является собственным устройством и может иметь различный ввод / вывод в зависимости от модели. Контроллеры имеют собственный API.

Программа сохраняет конфигурацию в файле конфигурации XML, который читается при запуске. Затем мне нужно подключиться к каждому неизвестному устройству и настроить подключение к каждому, оставляя мне метод обращения к каждому устройству позднее.

Вот что я пытаюсь достичь:

 using Brainboxes.IO;
 public class BrainBoxes
 {
   public string[] Devices = new string[] { "192.168.16.147", "192.168.16.148", "192.168.16.149", "192.168.16.150" };
   List<string> EDDeviceList = new List<string>();

 public BrainBoxes() // set up devices and connections to all devices connected in the constructor
 {
    foreach (string Device in Devices)
    {
        EDDevice BB400 = EDDevice.Create("192.168.16.147");
        // BB400 is a typical name but how do I make this dynamic at the same time making it
        // available for other members of the class?
        EDDeviceList.Add(BB400); // add the device to a list to refer to later in the constructor
    }
    for (int i = 0; i < EDDeviceList.Count - 1; i++) { BB400.Connect()}; // connect to each device in sequence. 
 }


    public void Outputs(int Relay)
    {
        // this would be a switch statement 

           BB400.Outputs[Relay].Value = 1;
            Thread.Sleep(75);

           BB400.Outputs[Relay].Value = 0;

    }
    ~BrainBoxes()
    {
        BB400.Disconnect();
    }
}

1 Ответ

1 голос
/ 24 января 2020

Похоже, вы пытаетесь сделать несколько вещей одновременно. Перефразируя то, что вы хотите: добиться (глядя на ваш вопрос, пример кода и ваш комментарий)

  • Когда ваше приложение запускается, вы хотите, чтобы оно автоматически подключалось к коллекции различных устройств
  • Во время работы пользователи могут подключаться и настраивать (правильное) устройство
  • Убедитесь, что соединения закрыты, когда приложение останавливается

Кроме того, ваш вопрос довольно открытый и Исходя из вашего первого заявления, я предполагаю, что вы новичок. Я знаю, что это довольно dry, но вам придется искать документацию для оборудования, которое вы используете. К счастью, это выглядит весьма всеобъемлющим

  1. Вам нужно дать своему классу более представительное имя. Например, BrainboxController или BrainboxManager, так как по звукам это то, для чего оно.
  2. Похоже, BB400 - это одно из возможных аппаратных устройств, оно является частью иерархии наследования, поэтому вы не хотите ограничивать себя только этим
  3. Я бы не стал делать много работы в конструкторе, это затрудняет поиск проблем 1027 *

    Строго говоря, если вы следуете принципу единой ответственности, этот класс должен просто управлять вашими устройствами и их соединениями. Методы GetConfiguration(), SetConfiguration() и GetOutputs() показаны в качестве примеров и действительно должны жить где-то еще.

    Ваш вызывающий код может выглядеть следующим образом (без внедрения зависимости):

    var deviceAddresses = new[] { "192.168.16.147", "192.168.16.148", "192.168.16.149", "192.168.16.150" };
    var controller = new BrainboxController(deviceAddresses);
    controller.InitialiseDevices();
    var currentDevice = controller.GetDevice("192.168.16.147");
    // do something with currentDevice
    

    Наконец, все, что вы пытаетесь сделать с помощью вашего Outputs метода, который выглядит как бизнес-логика c, и это также должно жить где-то еще.

...