Comment puis-je déterminer si une valeur Enum a une ou plusieurs des valeurs qu'il est en cours de comparaison avec?

StackOverflow https://stackoverflow.com/questions/2409025

  •  18-09-2019
  •  | 
  •  

Question

J'ai un Enum marqué avec l'attribut [Flags] comme suit:

[Flags]
public enum Tag : int
{
    None = 0,
    PrimaryNav = 1,
    HideChildPages = 2,
    HomePage = 4,
    FooterLink = 8
}

sitemapnodes dans mon plan Sitemap je stocke la valeur int pour la combinaison de balises comme attribut.

Ce que je dois faire est de vérifier si un nœud a une d'un ou plusieurs balises, par exemple Tag.PrimaryNav | Tag.HomePage.

Je me bats avec la logique booléenne nécessaire pour déterminer si une valeur Enum a une ou plusieurs des valeurs qu'il est en cours de comparaison avec.

Toutes mes excuses si ce n'est pas claire. Je peux fournir plus d'informations si nécessaire.

Était-ce utile?

La solution

Vous pouvez le faire en combinant les valeurs avec | et la vérification par &.

Pour vérifier si la valeur contient soit des tags:

if ((myValue & (Tag.PrimaryNav | Tag.HomePage)) != 0) { ... }

Le | combine les énumérations que vous testez (et les) au niveau du bit tests & par masquage de bits -. Si le résultat est zéro, il a au moins un d'entre eux set

Si vous voulez vérifier si elle a à la fois de les définir, vous pouvez le faire ainsi:

Tag desiredValue = Tag.PrimaryNav | Tag.HomePage;
if ((myValue & desiredValue) == desiredValue) { ... }

Ici, nous masquant tout ce que nous ne se soucient pas, et les tests de la valeur résultante est égale à ce que nous faire se soucient (nous ne pouvons pas utiliser != 0 comme avant parce que cela correspond < em> soit valeur et ici nous sommes intéressés à à la fois ).

Quelques liens:

Autres conseils

Vous pouvez utiliser la méthode hasFlag pour éviter la nécessité de la logique booléenne,

Tag Val = (Tag)9;

if (Val.HasFlag(Tag.PrimaryNav))
{
    Console.WriteLine("Primary Nav");
}

if(Val.HasFlag(Tag.HomePage))
{
    Console.WriteLine("Home Page");
}

Pour (Flags) au niveau du bit énumérations, un "tout de" test est = 0, donc:

const Tag flagsToLookFor = Tag.PrimaryNav | Tag.HomePage;
if ((node.Tag & flagsToLookFor) != 0) {
    // has some cross-over with PrimaryNav or HomePage (and possibly others too) 
}
var someEnumValue = Tag.PrimaryNav | Tag.HomePage;

Pour tester si le ENUM contient une valeur donnée:

if ((someEnumValue & Tag.PrimaryNav) == Tag.PrimaryNav)
{

}
var tag = Tag.HideChildPages | Tag.PrimaryNav;

If ((tag & Tag.PrimaryNav) == Tag.PrimaryNav) {
    // Tag.PrimaryNav set.
}

Vous pouvez utiliser cette méthode d'extension sur ENUM, pour tout type de énumérations:

public static bool IsSingle(this Enum value)
    {
        var items = Enum.GetValues(value.GetType());
        var counter = 0;
        foreach (var item in items)
        {
            if (value.HasFlag((Enum)item))
            {
                counter++;
            }
            if (counter > 1)
            {
                return false;
            }
        }
        return true;
    }
scroll top