Question
Existe-t-il un moyen de combiner des énumérations dans VB.net ?
La solution
Je crois que ce que vous voulez, c'est une énumération de type drapeau.
Vous devez ajouter l'attribut Flags en haut de l'énumération, puis vous pouvez combiner les énumérations avec le mot-clé « Ou ».
Comme ça:
<Flags()> _
Enum CombinationEnums As Integer
HasButton = 1
TitleBar = 2
ReadOnly = 4
ETC = 8
End Enum
Note: Les chiffres à droite sont toujours deux fois plus grands (puissances de 2) - cela est nécessaire pour pouvoir séparer les différents drapeaux posés.
Combinez les drapeaux souhaités à l'aide du mot-clé Ou :
Dim settings As CombinationEnums
settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly
Cela définit TitleBar et Readonly dans l'énumération
Pour vérifier ce qui a été défini :
If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then
Window.TitleBar = True
End If
Autres conseils
Vous pouvez utiliser le FlagsAttribute pour décorer un Enum comme ceci, ce qui vous permettra de combiner l'Enum :
<FlagsAttribute> _
Public Enumeration SecurityRights
None = 0
Read = 1
Write = 2
Execute = 4
Et puis appelez-les ainsi (classe UserPriviltes) :
Public Sub New ( _
options As SecurityRights _
)
New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute)
Ils sont effectivement combinés (calculs binaires) de sorte que l'utilisateur ci-dessus ait à la fois Lire ET Exécuter dans une seule variable SecurityRights sophistiquée.
Pour vérifier si l'utilisateur dispose d'un privilège, vous utilisez AND (plus de calculs au niveau du bit) pour vérifier la valeur enum de l'utilisateur avec la valeur Enum que vous recherchez :
//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 je comprends bien votre question, vous souhaitez combiner différents types d'énumérations.Ainsi, une variable peut stocker une valeur provenant de l'une des deux énumérations différentes, n'est-ce pas ?Si vous souhaitez stocker la combinaison de deux valeurs différentes d'un même type d'énumération, vous pouvez consulter l'explication de Dave Arkell.
Les énumérations ne sont que des entiers avec un peu de sucre syntaxique.Donc, si vous vous assurez qu'il n'y a pas de chevauchement, vous pouvez les combiner en les convertissant en int.
Cependant, cela ne donnera pas un joli code.J'essaie d'éviter d'utiliser des énumérations la plupart du temps.Habituellement, si vous laissez les énumérations se reproduire dans votre code, ce n'est qu'une question de temps avant qu'elles ne donnent naissance à des instructions case répétées et à d'autres anti-modèles désordonnés.
La clé de la combinaison Enum
s est de s'assurer que la valeur est une puissance de deux (1, 2, 4, 8, etc.) afin que vous puissiez effectuer des opérations sur les bits (|=
&=
).Ceux Enum
s peuvent être étiquetés avec un Flags
attribut.Le Anchor
La propriété sur les contrôles Windows Forms est un exemple d’un tel contrôle.S'il est marqué comme indicateur, Visual Studio vous permettra de vérifier les valeurs au lieu d'en sélectionner une seule dans une liste déroulante du concepteur de propriétés.
Si vous envisagez d'utiliser enum flags(), il y a un bon article ici.