Для этого нет встроенного механизма.Перечисления с флагами позволяют объединять любые комбинации элементов.Вам нужно будет выполнить ручную проверку в таком сценарии или создать модель, которая не принимает недопустимые параметры.Есть и другие варианты, но предпочтительный подход, который я бы выбрал, похож на этот:
class CarOptions
{
public SunroofKind Sunroof { get; set; }
public SpoilerKind Spoiler { get; set; }
public TintedWindowKind TintedWindow { get; set; }
// Note that I split this into two enums - the kind of tinted window
// (UV-resistant option too maybe?) and color might be different.
// This is just an example of how such option composition can be done.
public TintedWindowColor TintedWindowColor { get; set; }
// In this class, you can also implement additional logic, such as
// "cannot have spoiler on diesel engine models" and whatever may be required.
}
enum SunroofKind
{
None,
Electrical,
Mechanical
}
enum SpoilerKind
{
None,
Standard
}
enum TintedWindowKind
{
None,
Standard
}
enum TintedWindowColor
{
Black,
Blue
}
Как видите, я полностью избавился от первоначального перечисления.Я не вижу никакой причины использовать такую конструкцию в этом сценарии - комбинации различных переменных, которые также требуют применения логики комбинаций для конкретной области, не являются хорошими кандидатами для перечисления флагов.Опции и логика должны быть заключены в класс (или, возможно, в структуру, в зависимости от того, как он должен использоваться).
Перечисления с флагами полезны только для очень простых и / или специализированных случаев.