web-dev-qa-db-fra.com

L'énumération C # contient une valeur

J'ai une énumération

enum myEnum2 { ab, st, top, under, below}

Je voudrais écrire une fonction pour tester si une valeur donnée est incluse dans myEnum

quelque chose comme ca:

private bool EnumContainValue(Enum myEnum, string myValue)
{
     return Enum.GetValues(typeof(myEnum))
                .ToString().ToUpper().Contains(myValue.ToUpper()); 
}

Mais cela ne fonctionne pas car le paramètre myEnum n'est pas reconnu.

59
Fred Smith

Pas besoin d'écrire le vôtre:

    // Summary:
    //     Returns an indication whether a constant with a specified value exists in
    //     a specified enumeration.
    //
    // Parameters:
    //   enumType:
    //     An enumeration type.
    //
    //   value:
    //     The value or name of a constant in enumType.
    //
    // Returns:
    //     true if a constant in enumType has a value equal to value; otherwise, false.

    public static bool IsDefined(Type enumType, object value);

Exemple:

if (System.Enum.IsDefined(MyEnumType, MyValue))
{
    // Do something
}
45
LightStriker

Pourquoi ne pas utiliser

Enum.IsDefined(typeof(myEnum), value);

BTW c'est bien de créer un générique Enum<T> classe, qui entoure les appels à Enum (en fait, je me demande pourquoi quelque chose comme ça n'a pas été ajouté à Framework 2.0 ou version ultérieure):

public static class Enum<T>
{
    public static bool IsDefined(string name)
    {
        return Enum.IsDefined(typeof(T), name);
    }

    public static bool IsDefined(T value)
    {
        return Enum.IsDefined(typeof(T), value);
    }

    public static IEnumerable<T> GetValues()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }
    // etc
}

Cela permet d'éviter toutes ces choses typeof et d'utiliser des valeurs fortement typées:

Enum<StringSplitOptions>.IsDefined("None")
88

il suffit d'utiliser cette méthode

Enum.IsDefined Method - Retourne une indication si une constante avec une valeur spécifiée existe dans une énumération spécifiée

Exemple

enum myEnum2 { ab, st, top, under, below};
myEnum2 value = myEnum2.ab;
 Console.WriteLine("{0:D} Exists: {1}", 
                        value, myEnum2.IsDefined(typeof(myEnum2), value));
10
Pranay Rana

Dans ce cas, ce que vous faites avec ToString () est de:

Enum.GetValues(typeof(myEnum)).ToString()... à la place, vous devez écrire:

Enum.GetValues(typeof(myEnum).ToString()...

La différence est entre parenthèses ...

3
user1712937

Peut également utiliser ceci:

    enum myEnum2 { ab, st, top, under, below }
    static void Main(string[] args)
    {
        myEnum2 r;
        string name = "ab";
        bool result = Enum.TryParse(name, out r);
    }

Le résultat contiendra si la valeur est contenue dans enum ou non.

2
Akash Mehta

Si votre question est du type "J'ai un type d'énumération, enum MyEnum { OneEnumMember, OtherEnumMember }, et j'aimerais avoir une fonction qui indique si ce type d'énumération contient un membre avec un nom spécifique, alors ce que vous recherchez est le System.Enum.IsDefined méthode:

Enum.IsDefined(typeof(MyEnum), MyEnum.OneEnumMember); //returns true
Enum.IsDefined(typeof(MyEnum), "OtherEnumMember"); //returns true
Enum.IsDefined(typeof(MyEnum), "SomethingDifferent"); //returns false

Si votre question est comme "J'ai une instance d'un type enum, qui a l'attribut Flags, et j'aimerais avoir une fonction qui indique si cette instance contient une valeur d'énumération spécifique, alors la fonction ressemble à quelque chose comme ça:

public static bool ContainsValue<TEnum>(this TEnum e, TEnum val) where Enum: struct, IComparable, IFormattable, IConvertible
{
    if (!e.GetType().IsEnum)
        throw new ArgumentException("The type TEnum must be an enum type.", nameof(TEnum));

    dynamic val1 = e, val2 = val;
    return (val1 | val2) == val1;
}

J'espère que je pourrais vous aider.

2
florien
   public static T ConvertToEnum<T>(this string value)
    {
        if (typeof(T).BaseType != typeof(Enum))
        {
            throw new InvalidCastException("The specified object is not an enum.");
        }
        if (Enum.IsDefined(typeof(T), value.ToUpper()) == false)
        {
            throw new InvalidCastException("The parameter value doesn't exist in the specified enum.");
        }
        return (T)Enum.Parse(typeof(T), value.ToUpper());
    }
2
c-sharp

Utilisez le nom correct de l'énumération (myEnum2).

En outre, si vous testez une valeur de chaîne, vous pouvez utiliser GetNames au lieu de GetValues.

1
Cristian Lupascu

il suffit de lancer l'énumération comme:

string something = (string)myEnum;

et maintenant la comparaison est facile comme vous le souhaitez

1
Talha

Je pense que vous vous trompez lorsque vous utilisez ToString ().

Essayez de faire une requête Linq

private bool EnumContainValue(Enum myEnum, string myValue)
{
    var query = from enumVal in Enum.GetNames(typeof(GM)).ToList()
                       where enumVal == myValue
                       select enumVal;

    return query.Count() == 1;
}
1
MaLKaV_eS