Если список типов никогда не изменяется, вы можете сделать это:
NotificationMethodType allTypes = NotificationMethodType.Email |
NotificationMethodType.Fax |
NotificationMethodType.Sms;
NotificationMethodType notAssigned = allTypes & ~types;
~ создает обратное значение, инвертируя все биты.
Типичный способ определить такоеперечисления, чтобы хотя бы сохранить определение «allTypes», локальное для перечисления, означало бы включение двух новых имен в перечисление:
[Flags]
public enum NotificationMethodType {
None = 0,
Email = 1,
Fax = 2,
Sms = 4,
All = Email | Fax | Sms
}
Примечание : если вы идете по пути добавлениязначение All
для перечисления, обратите внимание, что если бы types
было пустым, вы бы не получили перечисление, которое напечатало бы как «электронная почта, факс, смс», а скорее как «все».
Если вы не хотите вручную вести список allTypes
, вы можете сделать это, используя метод Enum.GetValues
:
NotificationMethodType allTypes = 0;
foreach (NotificationMethodType type in Enum.GetValues(typeof(NotificationMethodType)))
allTypes |= type;
, или вы можете сделать то же самое с LINQ:
NotificationMethodType allTypes =
Enum.GetValues(typeof(NotificationMethodType))
.Cast<NotificationMethodType>()
.Aggregate ((current, value) => current | value);
Это строит значение allType
, объединяя все отдельные значения перечисления ИЛИ.