Я бы серьезно подумал, является ли это наиболее подходящим дизайном в этом контексте. Вы уверены, что в интерфейсе IMachine
не должно быть метода Process
? Каждая машина может реализовать это соответствующим образом, и тогда цикл просто становится:
foreach (IMachine machine in machines)
{
machine.Process();
}
В любом случае, чтобы ответить на вопрос в том виде, в котором он был задан, вот один из способов сделать это. Идея состоит в том, чтобы продолжать пробовать «умозрительное приведение» к целевому типу, пока это не удастся или у нас не будет выбора. Обычно это делается с помощью оператора 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(...);
}
}
Как видите, эта модель ужасна. Для более чистого решения вы также можете взглянуть на C # - есть ли лучшая альтернатива, чем эта, чтобы «включить тип» , если имеется большое количество разработчиков.