我正在尝试迭代项目列表。这些项目都是公共界面的一部分。它们如本问题所述。我想使用foreach循环来遍历它们,但是根据它是什么类型执行不同的操作。
为了简单起见,假设我要执行的操作如下:
ProcessLine(MachineLine ML); //For MachineLines
ProcessLine(MachineCircle MC); //For MachineCircles
Run Code Online (Sandbox Code Playgroud)
如何完成迭代以说明多种数据类型?
我会认真考虑在这种情况下这是否是最合适的设计。您确定IMachine接口不应该有Process方法吗?每台机器都可以适当地实现它,然后循环就变成了:
foreach (IMachine machine in machines)
{
machine.Process();
}
Run Code Online (Sandbox Code Playgroud)
无论如何,要回答所问的问题,这是一种解决方法。我们的想法是继续尝试对目标类型进行“投机投掷”,直到它成功或我们无法选择为止。通常由as操作员完成,然后进行null-test。
IList<IMachine> machines = ...
foreach (IMachine machine in machines)
{
MachineLine machineLine = machine as MachineLine;
if (machineLine != null)
ProcessLine(machineLine);
else
{
MachineCircle machineCircle = machine as MachineCircle;
if (machineCircle != null)
ProcessCircle(machineCircle);
else throw new UnknownMachineException(...);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,这种模式很难看。对于更清洁的解决方案,您可能还想看一下C#-如果有大量的实现者,是否有比“打开类型”更好的替代方法了?