Wpf – Enumeraciones con opciones múltiples
Las enumeraciones con opciones múltiples son aquellas que están marcadas con el atributo [ FlagsAttribute() ] y que permiten elegir varias opciones a la vez, en lugar de una sola, por ejemplo, podemos elegir en una supuesta enumeración el grabar un texto en disco, y ademas, en un archivo
Un poco de código (mío) a modo de ejemplo:
Este código esta copiado de una clase que cambia los caracteres por sus entidades, Ejemplo; Reemplazar [á], por [á] para XML o bien por [á] para HTML. Es decir, solo muestra la idea de como se hace, pero no es un código funcional.
Consta de la enumeración que esta marcada con el atributo [ FlagsAttribute ], y una función que muestra como se usa esa enumeración para ejecutar varios procesos
Previamente, en el código elijo el tipo de carácter a convertir, por ejemplo
Dim tipoDeConversion As EConvertir = EConvertir.SoloVocalesAcentuadas Or EConvertir.SoloAngulitos
Esta es la enumeración que utilizo
<FlagsAttribute()> Public Enum EConvertir None = 0 SoloAmpersand = 1 SoloAngulitos = 2 SoloComilasDobles = 4 SoloComilasSencillas = 8 SoloCaracteres = 16 SoloVocalesAcentuadas = 32 ''' <summary> ''' Convierte todos los caracteres (todo lo anterior junto) ''' </summary> Todo = 64 End Enum
El código (Vb) que usa esta enumeración
''' ------------------------------------------------- ''' <summary> ''' Cambia los caracteres especiales por su entidad equivalente, ''' por ejemplo las vocales acentuadas por su entidad ''' </summary> ''' <param name = "paramUnaCadena"> ''' La cadena que se va a explorar y en la que se van a convertir los caracteres especiales</param> ''' <param name = "paramTipoConversionE"> ''' Que caracteres se convierte, las vocales, los angulitos, etc</param> ''' <param name = "paramTipoEntidadE">que entidad quiero obtener, para HTML o para XML</param> ''' <returns>La cadena con los caracteres especiales convertidos en entidades</returns> ''' ------------------------------------------------- Public Shared Function CaracterToEntidad( ByVal paramUnaCadena As String, ByVal paramTipoConversionE As EConvertir, ByVal paramTipoEntidadE As EEntidades) As String '------------------------------------------ ' Control del parámetro '------------------------------------------ ' no se permiten valore nothing, ni empty, ni WhiteSpace en la cadena de entrada ' no se permiten valores NONE en las enumeraciones '------------------------------------------ ' la cadena de salida inicial Dim cadenaSalida As String = paramUnaCadena Dim controlParanoico As Boolean Try controlParanoico = False If paramTipoConversionE = EConvertir.None Then ' No acepto este valor Call DispararErrorEnumeracionNoPuedeTomarEseValor(Etc, etc) End If 'None = 0 'SoloAmpersand = 1 'SoloAngulitos = 2 'SoloComilasDobles = 4 'SoloComilasSencillas = 8 'SoloCaracteres = 16 'SoloVocalesAcentuadas = 32 'Todo = 64 '------------------------------------ ' opciones multiples If (paramTipoConversionE And EConvertir.SoloAmpersand) = EConvertir.SoloAmpersand Then ' código correspondiente a esta opcion de la enumeracion. Por ejemplo cadenaSalida = AmpersandToEntidad(cadenaSalida, paramTipoEntidadE) controlParanoico = True End If If (paramTipoConversionE And EConvertir.SoloAngulitos) = EConvertir.SoloAngulitos Then ' código correspondiente a esta opcion de la enumeracion. Por ejemplo cadenaSalida = AngulitosToEntidad(paramUnaCadena, paramTipoEntidadE) controlParanoico = True End If If (paramTipoConversionE And EConvertir.SoloComilasDobles) = EConvertir.SoloComilasDobles Then ' código correspondiente a esta opcion de la enumeracion. Por ejemplo cadenaSalida = ComillasDoblesToEntidad(paramUnaCadena, paramTipoEntidadE) controlParanoico = True End If If (paramTipoConversionE And EConvertir.SoloComilasSencillas) = EConvertir.SoloComilasSencillas Then ' código correspondiente a esta opcion de la enumeracion. Por ejemplo cadenaSalida = ComillasSencillasToEntidad(paramUnaCadena, paramTipoEntidadE) controlParanoico = True End If If (paramTipoConversionE And EConvertir.SoloCaracteres) = EConvertir.SoloCaracteres Then ' código correspondiente a esta opcion de la enumeracion. Por ejemplo cadenaSalida = CaracteresToEntidad(paramUnaCadena, paramTipoEntidadE) controlParanoico = True End If If (paramTipoConversionE And EConvertir.SoloVocalesAcentuadas) = EConvertir.SoloVocalesAcentuadas Then ' código correspondiente a esta opcion de la enumeracion. Por ejemplo cadenaSalida = VocalesAcentuadasToEntidad(paramUnaCadena, paramTipoEntidadE) controlParanoico = True End If If (paramTipoConversionE And EConvertir.Todo) = EConvertir.Todo Then ' código correspondiente a esta opcion de la enumeracion. Por ejemplo cadenaSalida = AmpersandToEntidad(paramUnaCadena, paramTipoEntidadE) cadenaSalida = AngulitosToEntidad(cadenaSalida, paramTipoEntidadE) cadenaSalida = ComillasDoblesToEntidad(cadenaSalida, paramTipoEntidadE) cadenaSalida = ComillasSencillasToEntidad(paramUnaCadena, paramTipoEntidadE) cadenaSalida = VocalesAcentuadasToEntidad(paramUnaCadena, paramTipoEntidadE) cadenaSalida = CaracteresToEntidad(cadenaSalida, paramTipoEntidadE) controlParanoico = True End If If controlParanoico = False Then ' Quiere decir que algo no ha funcionado Throw New ArgumentException(etc,etc) End If Catch ex As System.Exception Throw End Try '------------------------------------------- Return cadenaSalida End Function
La documentación MSDN indica lo siguiente para este tipo de enumeraciones:
Comentarios
Los campos de bits se utilizan normalmente para las listas de elementos que se pueden producir en combinación, mientras que las constantes de enumeración se suelen usar para listas de elementos mutuamente excluyentes. Por lo tanto, los campos de bits están diseñados para combinarse con una operación OR bit a bit para generar valores sin nombre, mientras que las constantes enumeradas no lo son. Los lenguajes varían en el uso de campos de bits en comparación con las constantes de enumeración.