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.
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
}
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")
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));
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 ...
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.
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.
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());
}
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
.
il suffit de lancer l'énumération comme:
string something = (string)myEnum;
et maintenant la comparaison est facile comme vous le souhaitez
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;
}