C# 在列表中加载 类 的集合

C# Load Collection of Classes in a List

我有一个程序,我创建了一个小型数据库。数据库中的每个设备(class)都使用一个接口。 我在运行时从一个文本文件加载每个驱动程序,该文件读取设备配置并通过反射加载适当的驱动程序。 我可以在控制台中看到每个设备都已创建,并且可以在创建时调用方法。问题是我想创建驱动程序,将它们添加到设备集合中,然后通过枚举列表调用它们。到目前为止,它每次只调用添加到列表中的最后一个设备。

这是将设备添加到列表的代码:

if (loadedDisplay != null)
{
    try
    {
        CrestronConsole.PrintLine("Display Class is valid + {0}", loadedDisplay.ToString());
        if (videoDisplay.isCrestronConnected)
        {
            CrestronConsole.PrintLine("Display is Crestron Connected");
            loadedDisplay.RegisterNewDisplay(videoDisplay.CrestronConnectedIPID, videoDisplay.Name, Global.ControlSystem);
            loadedDisplay.DisplayPowerEvent += new EventHandler<DisplayPowerEventArgs>(loadedDisplay_DisplayPowerEvent);
            loadedDisplay.DisplayMuteEvent += new EventHandler<DisplayMuteEventArgs>(loadedDisplay_DisplayMuteEvent);
            loadedDisplay.DisplayOnlineChangeEvent += new EventHandler<DisplayOnlineEventArgs>(loadedDisplay_DisplayOnlineChangeEvent);
        }
        else if (!videoDisplay.isCrestronConnected)
        {
            CrestronConsole.PrintLine("Display is not Crestron Connected");
            foreach (var port in Global._rmcComports)
            {
                CrestronConsole.PrintLine(videoDisplay.Name + " On Port  " + port.port);
                if (videoDisplay.Name == port.portDescrition)
                {
                    try
                    {
                        loadedDisplay.SetComSpec(port.port, videoDisplay.Name);
                    }
                    catch (Exception e)
                    {
                        CrestronConsole.PrintLine("Exception thrown : " + e.Message);
                    }
                }
            }
        }
        try
        {
            DisplayCollection.systemDisplayList.Add(new SystemDisplays
            {
                displayInterface = loadedDisplay,
                displayDescrition = videoDisplay.Name,
                PowerOnJoin = videoDisplay.PowerOnJoin,
                PowerOffJoin = videoDisplay.PowerOffJoin,
                MuteToggleJoin = videoDisplay.MuteToggleJoin
            });
        }
        catch (Exception e)
        {
            CrestronConsole.PrintLine("Error adding to list : " + e.Message);
        }
    }
    catch (Exception error)
    {
        CrestronConsole.PrintLine(LogHeader + "Failed to create instance : {0}", error.Message);
    }                   
}

此时我可以调用 RegisterNewDsiplay 或 SetComSpec 等方法。

然后当我 UI 上的按钮被按下时,我枚举集合并调用适当的方法。

示例:

switch (joinNumber)
{
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
    {
        if (args.Sig.BoolValue == true)
        {
            foreach (var display in DisplayCollection.systemDisplayList)
            {
                if (display.PowerOnJoin == joinNumber)
                {
                    display.displayInterface.DisplayPowerOn();
                }
                else if (display.PowerOffJoin == joinNumber)
                {
                    display.displayInterface.DisplayPowerOff();
                }
            }
        }
        break;
    }
}

此时,如果我调用 PowerOn 或 PowerOff,即使 PowerOnJoin != joinNumber,它也只会将请求发送到添加到集合中的最后一个显示器。

有什么想法吗?

经过大量研究,我意识到了我的问题。 我创建的列表不是正确的数据集合。

我必须创建接口列表:

static public List<Framework.DisplayDrivers.IDisplayInterface> systemDisplayList = new List<Framework.DisplayDrivers.IDisplayInterface>();

然后我可以将 类 的新实例添加到接口列表并调用方法并设置所需的任何变量:

  DisplayCollection.systemDisplayList.Add(new Framework.DisplayDrivers.CrestronConnectedDisplay
                           {
                               DisplayName = videoDisplay.Name,
                               PowerOnJoin = videoDisplay.PowerOnJoin,
                               PowerOffJoin = videoDisplay.PowerOffJoin,
                               isCrestronConnected = videoDisplay.isCrestronConnected,
                               displayIPID = videoDisplay.CrestronConnectedIPID,
                               CS = Global.ControlSystem
                           });