Às vezes, ao ler o código C # de outras pessoas, vejo um método que aceitará vários valores enum em um único parâmetro. Sempre achei que era legal, mas nunca olhei para isso.
Bem, agora eu acho que posso ter uma necessidade, mas não sei como
- configurar a assinatura do método para aceitar isso
- trabalhar com os valores do método
- definir o enum
para conseguir esse tipo de coisa.
Em minha situação específica, gostaria de usar System.DayOfWeek, que é definido como:
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
Eu quero passar um ou mais dos valores DayOfWeek para meu método. Serei capaz de usar este enum específico como está? Como faço as 3 coisas listadas acima?
Respostas:
Ao definir o enum, apenas atribua-o com [Flags], defina os valores para potências de dois e funcionará desta forma.
Nada mais muda, a não ser passar vários valores para uma função.
Por exemplo:
Para obter mais detalhes, consulte a documentação do MSDN sobre Tipos de Enumeração .
Edite em resposta aos acréscimos à pergunta.
Você não poderá usar aquele enum como está, a menos que queira fazer algo como passá-lo como um array / coleção / array de parâmetros. Isso permitiria passar vários valores. A sintaxe dos sinalizadores requer que o Enum seja especificado como sinalizadores (ou para bastardizar a linguagem de uma forma que não foi projetada).
fonte
Acho que a solução mais elegante é usar HasFlag ():
fonte
DaysOfWeek days = new DaysOfWeek(); if (cbTuesday.Checked) days |= DaysOfWeek.Tuesday; if (cbWednesday.Checked) days |= DaysOfWeek.Wednesday;
...Eu apoio a resposta de Reed. No entanto, ao criar o enum, você deve especificar os valores para cada membro do enum para que ele crie uma espécie de campo de bits. Por exemplo:
fonte
Você não pode usar o System.DayOfWeek como uma
[Flags]
enumeração porque você não tem controle sobre ele. Se você deseja ter um método que aceita múltiplos,DayOfWeek
então você terá que usar aparams
palavra - chaveCaso contrário, você pode criar sua própria
[Flags]
enumeração conforme descrito por vários outros respondentes e usar comparações bit a bit.fonte
Você tem que especificar os números e incrementá-los assim, porque isso está armazenando os valores de forma bit a bit.
Em seguida, apenas defina seu método para obter este enum
e chamá-lo de fazer algo como
Para verificar se um dos valores enum foi incluído, verifique-os usando operações bit a bit como
fonte
chame o método neste formato
MethodName (DaysOfWeek.T Terça | DaysOfWeek.Thucted);
Implementar um método EnumToArray para passar as opções
fonte
Marque seu enum com o atributo [Sinalizadores]. Além disso, certifique-se de que todos os seus valores sejam mutuamente exclusivos (dois valores não podem somar igual a outro) como 1,2,4,8,16,32,64 no seu caso
Quando você tem um método que aceita um enum DayOfWeek, use o bit a bit ou o operador (|) para usar vários membros juntos. Por exemplo:
Para verificar se o parâmetro contém um membro específico, use o bit a bit e o operador (&) com o membro que você está verificando.
fonte
Reed Copsey está correto e eu acrescentaria à postagem original se pudesse, mas não posso, então terei de responder.
É perigoso usar apenas [Sinalizadores] em qualquer enum antigo. Acredito que você tenha que alterar explicitamente os valores de enum para potências de dois ao usar sinalizadores, para evitar conflitos nos valores. Consulte as diretrizes para FlagsAttribute e Enum .
fonte
Com a ajuda das respostas postadas e estas:
Eu sinto que entendo muito bem.
Obrigado.
fonte
Algo dessa natureza deve mostrar o que você está procurando:
fonte