visual net fields enum and .net vb.net enums

.net - net - Combinando Enums



vb net and or (5)

¿Hay alguna forma de combinar Enums en VB.net?


Creo que lo que quieres es una enumeración tipo bandera.

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

Me gusta esto:

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

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

Combine los indicadores deseados con la palabra clave O:

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

Esto establece TitleBar y Readonly en la enumeración

Para verificar lo que se ha establecido:

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


La clave para la combinación de Enum es asegurarse de que el valor sea una potencia de dos (1, 2, 4, 8, etc.) para que pueda realizar operaciones de bits sobre 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.


Puedes usar FlagsAttribute para decorar un Enum como tal que te permitirá combinar el Enum:

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

Y luego llámalos así (clase UserPriviltes):

Public Sub New ( _ options As SecurityRights _ ) New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute)

Se combinan de manera efectiva (bit math) para que el usuario anterior tenga tanto Read como Execute, todos ejecutados en una variable de lujo SecurityRights.

Para verificar si el usuario tiene un privilegio, usa Y (más matemáticas en modo bit) para verificar el valor enum de los usuarios con el valor Enum que está buscando:

//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


Si entiendo tu pregunta correctamente, quieres 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 combinando 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.


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