迭代不同数据类型的列表?

Ada*_*m S 2 c# foreach list

我正在尝试迭代项目列表。这些项目都是公共界面的一部分。它们如本问题所述。我想使用foreach循环来遍历它们,但是根据它是什么类型执行不同的操作。

为了简单起见,假设我要执行的操作如下:

ProcessLine(MachineLine ML); //For MachineLines
ProcessLine(MachineCircle MC); //For MachineCircles
Run Code Online (Sandbox Code Playgroud)

如何完成迭代以说明多种数据类型?

Ani*_*Ani 5

我会认真考虑在这种情况下这是否是最合适的设计。您确定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#-如果有大量的实现者,是否有比“打开类型”更好的替代方法了

  • +1 建议在第一段中使用“IMachine.Process()”方法。 (2认同)