У меня есть объект, который представляет физическую структуру (например, вспомогательный столб), и он касается множества других объектов (проводов на полюсе). Другие объекты имеют ряд характеристик (состояние, размер, напряжение, фаза и т. Д.), Выраженных в виде перечислений. Я хочу написать универсальную функцию, которая подсчитывает, сколько проводов соответствует какой-либо или всем характеристикам.
Если бы перечисления были первоклассными объектами, я бы просто написал так:
class Wire
{
public EStatus Status { get; set; }
public ESize Size { get; set; }
public EVoltage Voltage { get; set; }
public EPhase Phase { get; set; }
}
int CountWires(EStatus status, ESize size, EVoltage voltage, EPhase phase)
{
int count = 0;
foreach (Wire wire in _connectedWires)
{
if (status != null && wire.Status != status) continue;
if (size != null && wire.Size != size) continue;
//...
++count;
}
return count;
}
... и сможете вызывать его для подсчета только новых больших проводов любого напряжения и фазы, например:
CountWires(EStatus.New, ESize.Large, null, null);
... но, конечно, я получаю ошибку cannot convert from '<null>' to 'EVoltage'
.
В прошлом мы решали эту проблему, добавляя значение «Any» к самим перечислениям и проверяя это, но затем, если мы сделаем что-то вроде отображения всех возможных значений в списке для пользователя, мы должны отфильтровать "Любой". Поэтому я хочу избежать этого.
Я подумал, что расскажу об этом сообществу и посмотрим, есть ли у кого-нибудь идеи, как сделать это с чистым интерфейсом и простым для чтения вызывающим кодом. У меня есть свой ответ, с которым я играю, и добавлю к обсуждению.