A veces, al leer el código C # de otros, veo un método que acepta múltiples valores de enumeración en un solo parámetro. Siempre pensé que estaba un poco ordenado, pero nunca lo investigué.
Bueno, ahora creo que puedo necesitarlo, pero no sé cómo
- configurar la firma del método para aceptar esto
- trabajar con los valores en el método
- definir la enumeración
para lograr este tipo de cosas.
En mi situación particular, me gustaría usar System.DayOfWeek, que se define como:
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
Quiero poder pasar uno o más de los valores de DayOfWeek a mi método. ¿Podré usar esta enumeración en particular tal como está? ¿Cómo hago las 3 cosas enumeradas anteriormente?
Respuestas:
Cuando defina la enumeración, simplemente atribuícela con [Flags], establezca los valores en potencias de dos y funcionará de esta manera.
Nada más cambia, aparte de pasar varios valores a una función.
Por ejemplo:
Para obtener más detalles, consulte la documentación de MSDN sobre tipos de enumeración .
Edite en respuesta a las adiciones a la pregunta.
No podrá usar esa enumeración tal como está, a menos que desee hacer algo como pasarla como una matriz / colección / matriz params. Eso le permitiría pasar múltiples valores. La sintaxis de banderas requiere que Enum se especifique como banderas (o bastardizar el lenguaje de una manera que no está diseñada).
fuente
Creo que la solución más elegante es usar HasFlag ():
fuente
DaysOfWeek days = new DaysOfWeek(); if (cbTuesday.Checked) days |= DaysOfWeek.Tuesday; if (cbWednesday.Checked) days |= DaysOfWeek.Wednesday;
...Secundo la respuesta de Reed. Sin embargo, al crear la enumeración, debe especificar los valores para cada miembro de la enumeración para que haga una especie de campo de bits. Por ejemplo:
fuente
No puede utilizar System.DayOfWeek como
[Flags]
enumeración porque no tiene control sobre él. Si desea tener un método que acepte múltiplesDayOfWeek
, deberá utilizar laparams
palabra claveDe lo contrario, puede crear su propia
[Flags]
enumeración como lo describen muchos otros respondedores y utilizar comparaciones bit a bit.fuente
Debe especificar los números e incrementarlos así porque está almacenando los valores de forma bit a bit.
Entonces simplemente defina su método para tomar esta enumeración
y llamarlo haz algo como
Para verificar si se incluyó uno de los valores de enumeración, verifíquelos usando operaciones bit a bit como
fuente
llamar al método en este formato
MethodName (DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
Implementar un método EnumToArray para que se pasen las opciones
fuente
Marque su enumeración con el atributo [Flags]. También asegúrese de que todos sus valores sean mutuamente excluyentes (dos valores no pueden sumar para igualar otro) como 1,2,4,8,16,32,64 en su caso
Cuando tenga un método que acepte una enumeración DayOfWeek, use el operador or bit a bit (|) para usar varios miembros juntos. Por ejemplo:
Para verificar si el parámetro contiene un miembro específico, use el operador bit a bit y (&) con el miembro que está buscando.
fuente
Reed Copsey tiene razón y lo agregaría a la publicación original si pudiera, pero no puedo, así que tendré que responder.
Es peligroso usar [Flags] en cualquier enumeración antigua. Creo que tienes que cambiar explícitamente los valores de enumeración a potencias de dos cuando usas banderas, para evitar choques en los valores. Consulte las directrices para FlagsAttribute y Enum .
fuente
Con la ayuda de las respuestas publicadas y estas:
Siento que lo entiendo bastante bien.
Gracias.
fuente
Algo de esta naturaleza debería mostrar lo que estás buscando:
fuente