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
});
我有一个程序,我创建了一个小型数据库。数据库中的每个设备(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
});