Digamos que eu tenho esse enum:
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
AB = A | B,
All = A | B | C,
}
Para verificar se, por exemplo, AB
está definido, posso fazer o seguinte:
if((letter & Letters.AB) == Letters.AB)
Existe uma maneira mais simples de verificar se algum dos sinalizadores de uma constante de sinalizador combinado está definido como o seguinte?
if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
Você poderia, por exemplo, trocar o &
item com algo?
Não é muito estável quando se trata de coisas binárias como esta ...
Respostas:
Se você quiser saber se a letra tem alguma das letras em AB, use o operador AND &. Algo como:
fonte
letter & Letters.AB
. Editou isso lá.Letters.None
, presumo que você possa trocá-lo com0
um visual menos comparável com o número mágicoNo .NET 4, você pode usar o método Enum.HasFlag :
O exemplo exibe a seguinte saída:
fonte
petsInFamily
tem umPet.Dog || Pet.Cat
?Eu uso métodos de extensão para escrever coisas assim:
Aqui está o código:
fonte
where T : struct, IConvertible
. Código excelente caso contrário!IsFlagSet(this Enum value, Enum flag)
é suficiente.Há o método HasFlag no .NET 4 ou superior.
fonte
Se você pode usar o .NET 4 ou superior, use o método HasFlag ()
exemplos
igual a
fonte
bitwise OR
que "ambos devem ser definidos" e não nenhum?bitwise OR
combinaria os valores, então 1000 | 0010 torna-se 1010, ou ambos setSe isso realmente te incomoda, você pode escrever uma função assim:
fonte
return (value & flag) == flag;
não compila: "Operador 'e' não podem ser aplicados a operandos do tipo 'T' e 'T'" .Isso verifica que ambos A e B são definidas e ignora se qualquer outras bandeiras são set.
Isso verifica se A ou B está definido e ignora se outros sinalizadores estão definidos ou não.
Isso pode ser simplificado para:
Aqui está o C para operações binárias; deve ser simples aplicá-lo ao c #:
Aliás, a nomeação da variável no exemplo da pergunta é a singular 'letra', o que pode implicar que ela represente apenas uma única letra; o código de exemplo deixa claro que é um conjunto de letras possíveis e que vários valores são permitidos; portanto, considere renomear a variável 'letters'.
fonte
anything_and_a
,a_and_or_c_and_anything_else
eboth_ac_and_anything_else
sempre será verdade? ou estou faltando alguma coisa aqui?E se
?
fonte
Eu criei um método de extensão simples que não precisa checar os
Enum
tipos:Também funciona em enumerações anuláveis. O
HasFlag
método padrão não, então eu criei uma extensão para cobrir isso também.Um teste simples:
Aproveitar!
fonte
Existem muitas respostas aqui, mas acho que a maneira mais idiomática de fazer isso com Flags seria Letters.AB.HasFlag (letter) ou (Letters.A | Letters.B) .HasFlag (letter) se você não já tem Letters.AB. letter.HasFlag (Letters.AB) só funciona se tiver os dois.
fonte
Isso funcionaria para você?
Saudações,
Sebastiaan
fonte
Você pode usar este método de extensão em enum, para qualquer tipo de enumeração:
fonte
fonte
Você pode apenas verificar se o valor não é zero.
Mas consideraria uma solução melhor introduzir um novo valor de enumeração com o valor zero e comparar novamente esse valor de enumeração (se possível, porque você deve poder modificar a enumeração).
ATUALIZAR
Não entendi bem a pergunta - consertei a primeira sugestão e simplesmente ignore a segunda.
fonte
Existem duas abordagens que eu posso ver que funcionariam para verificar se algum bit está sendo definido.
Abordagem A
Isso funciona desde que você não se importe de verificar todos os bits, incluindo os não definidos também!
Abordagem B
Isso verifica apenas os bits definidos, desde que Letters.All represente todos os bits possíveis.
Para bits específicos (um ou mais conjuntos), use o Aproach B substituindo Letters.All pelos bits que você deseja verificar (veja abaixo).
fonte
Desculpe, mas eu vou mostrá-lo em VB :)
CntValue = 5 Portanto, o enum contém 1 + 4
fonte