В C# enum содержит значение
у меня есть перечислимый
enum myEnum2 { ab, st, top, under, below}
Я хотел бы написать функцию для проверки, если данное значение Включено в myEnum
что-то вроде этого:
private bool EnumContainValue(Enum myEnum, string myValue)
{
return Enum.GetValues(typeof(myEnum))
.ToString().ToUpper().Contains(myValue.ToUpper());
}
но это не работает, потому что myenum параметр не распознается.
10 ответов:
Не нужно писать свой собственный:
// 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);пример:
if (System.Enum.IsDefined(MyEnumType, MyValue)) { // Do something }
почему бы не использовать
Enum.IsDefined(typeof(myEnum), value);кстати приятно создавать generic
Enum<T>класс, который обертывает вызовыEnum(на самом деле мне интересно, почему что-то подобное не было добавлено в Framework 2.0 или более поздней версии):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 }это позволяет избежать всего этого
typeofматериал и использовать строго типизированные значения:Enum<StringSplitOptions>.IsDefined("None")
просто используйте этот метод
перечисление.IsDefined Method - возвращает указание, существует ли константа с указанным значением в указанном перечислении
пример
enum myEnum2 { ab, st, top, under, below}; myEnum2 value = myEnum2.ab; Console.WriteLine("{0:D} Exists: {1}", value, myEnum2.IsDefined(typeof(myEnum2), value));
то, что вы делаете с ToString() в этом случае является:
Enum.GetValues(typeof(myEnum)).ToString()...вместо этого вы должны написать:Enum.GetValues(typeof(myEnum).ToString()...разница в скобках...
также можно использовать это:
enum myEnum2 { ab, st, top, under, below } static void Main(string[] args) { myEnum2 r; string name = "ab"; bool result = Enum.TryParse(name, out r); }результат будет содержать ли значение в enum или нет.
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()); }
если ваш вопрос похож на "У меня есть тип перечисления,
enum MyEnum { OneEnumMember, OtherEnumMember }, и я хотел бы иметь функцию, которая говорит, содержит ли этот тип перечисления член с определенным именем, то, что вы ищете, этоSystem.Enum.IsDefinedспособ:Enum.IsDefined(typeof(MyEnum), MyEnum.OneEnumMember); //returns true Enum.IsDefined(typeof(MyEnum), "OtherEnumMember"); //returns true Enum.IsDefined(typeof(MyEnum), "SomethingDifferent"); //returns falseесли ваш вопрос похож на "У меня есть экземпляр типа перечисления, который имеет
Flagsатрибут, и я хотел бы иметь функцию, которая говорит, содержит ли этот экземпляр определенное значение перечисления, то функция выглядит примерно так это: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; }надеюсь, что я мог бы помочь.
используйте правильное имя перечисления (
myEnum2).кроме того, если вы тестируете строковое значение, которое вы можете использовать
GetNamesвместоGetValues.
просто приведите перечисление как:
string something = (string)myEnum;и теперь сравнение легко, как вам нравится
Я думаю, что вы ошибаетесь при использовании ToString().
попробуйте сделать запрос 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; }
Comments