2008-09-12 13 views

Respuesta

40

Creo que lo que quiere es un enum de tipo bandera.

Debe agregar el atributo Flags a la parte superior de la enumeración, y luego puede combinar enumeraciones con la palabra clave 'O'.

De esta manera:

<Flags()> _ 
Enum CombinationEnums As Integer 
    HasButton = 1 
    TitleBar = 2 
    ReadOnly = 4 
    ETC = 8 
End Enum 

Nota: Los números a la derecha siempre son dos veces más grandes (potencias de 2) - esto es necesario para poder separar las banderas individuales que se han establecido.

Combinar las banderas deseadas usando la palabra clave O:

Dim settings As CombinationEnums 
settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly 

Esto establece TitleBar y Sólo lectura en la enumeración

Para comprobar lo que se ha establecido:

If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then 
    Window.TitleBar = True 
End If 
+0

Gran respuesta. En caso de que no sea inmediatamente obvio, (como señala Jonas Follesø en su respuesta), la clave para esto es usar los valores de Enum a la potencia de 2 (1,2,4,8,16, etc.) – Andrew

+11

. usando .NET 4, entonces puedes usar el método .HasFlag para hacer que el código sea un poco más fácil de leer - Si settings.HasFlag (CombinationEnums.TitleBar) Then blah blah –

0

Si toma sobre usar enum flags() hay un buen artículo here.

1

Si entiendo su pregunta correctamente, quiere combinar diferentes tipos de enumeración. Entonces, ¿una variable puede almacenar un valor de uno de los dos enum's right? Si está preguntando sobre el almacenamiento de la combinación de dos valores diferentes de un tipo de enumeración, puede consultar la explicación de Dave Arkell

Los mensajes son solo enteros con algo de azúcar sintáctico. Entonces, si se asegura de que no haya superposición, puede combinarlos mediante conversión a int.

Sin embargo, no será un código bonito. Intento evitar el uso de enumeraciones la mayor parte del tiempo. Por lo general, si permite que las enumeraciones se reproduzcan en su código, es solo cuestión de tiempo antes de que den a luz declaraciones de casos repetidos y otros antipatrones sucios.

1

La clave de la combinación Enum s es asegurarse de que el valor es una potencia de dos (1, 2, 4, 8, etc.) de manera que se pueden realizar operaciones de bits en ellos (|=&=). Esos Enum s se pueden etiquetar con un atributo Flags. La propiedad Anchor en los controles de Windows Forms es un ejemplo de dicho control. Si está marcado como indicador, Visual Studio le permitirá verificar los valores en lugar de seleccionar uno solo en un menú desplegable en el diseñador de propiedades.

+3

Potencias de dos: ¡no olvide 1 = 2^0! –

+0

También siempre es bueno proporcionar un valor 0 para "ninguno". – Nyerguds

3

Puede utilizar el FlagsAttribute para decorar un Enum como tal que le permitirá combinar el Enum:

<FlagsAttribute> _ 
Public Enumeration SecurityRights 
None = 0 
Read = 1 
Write = 2 
Execute = 4 

Y luego llamarlos así como UserPriviltes (clase):

Public Sub New (_ 
    options As SecurityRights _ 
) 

New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute) 

Ellos obtener efectivamente combinado (matemáticas bits) para que el usuario anterior tiene tanto leer y ejecutar todos ellos llevados alrededor en una variable de fantasía SecurityRights.

Para comprobar para ver si el usuario tiene un privilegio utiliza Y (más matemáticas a nivel de bits) para comprobar los usuarios del valor de enumeración con el valor de enumeración se esté examinando para:

//Check to see if user has Write rights 
If (user.Privileges And SecurityRights.Write = SecurityRigths.Write) Then 
    //Do something clever... 
Else 
    //Tell user he can't write. 
End If 

HTH, Tyler

+0

¿por qué no usar un BitVector32? – Maslow

+0

@abatishchev Eso no es lo que obtuve del artículo. 'Nombrar el valor cero de enumeraciones de banderas Ninguna' ...' el valor siempre debe significar que todas las banderas están despejadas'. Lo que dice es que no debe usar cero para significar algún estado adicional, sino que cero significa que no hay estado (es decir, "ninguno"). –

+0

-1. Ha arruinado el uso de , al establecer valores que NO SON PODERES DE 2. .Net no causa mágicamente que los patrones de bits "1" y "3" de su ejemplo no colisionen. – ToolmakerSteve