Si la lista de tipos nunca cambia, usted puede hacer esto:
NotificationMethodType allTypes = NotificationMethodType.Email |
NotificationMethodType.Fax |
NotificationMethodType.Sms;
NotificationMethodType notAssigned = allTypes & ~types;
El ~ crea un valor inverso, invirtiendo todos los bits.
Una forma típica de definir tales enumeraciones a por lo menos mantener la definición de "ALLTYPES" locales para la enumeración sería incluir dos nuevos nombres en la enumeración:
[Flags]
public enum NotificationMethodType {
None = 0,
Email = 1,
Fax = 2,
Sms = 4,
All = Email | Fax | Sms
}
Nota: Si vas la ruta de agregar el valor All
a la enumeración, tenga en cuenta que si types
estaba vacío, no obtendría una enumeración que imprimiría como "Correo electrónico, fax, SMS", sino más bien como "Todos".
Si no desea mantener manualmente la lista de allTypes
, puede hacerlo utilizando el método Enum.GetValues
:
NotificationMethodType allTypes = 0;
foreach (NotificationMethodType type in Enum.GetValues(typeof(NotificationMethodType)))
allTypes |= type;
o puede hacer lo mismo con LINQ:
NotificationMethodType allTypes =
Enum.GetValues(typeof(NotificationMethodType))
.Cast<NotificationMethodType>()
.Aggregate ((current, value) => current | value);
Esto construye el valor allType
al ordenar todos los valores individuales de la enumeración.
fwiw, XOR (los^operadores) y las respuestas "y no" de Lasse son matemáticamente la misma cosa. –