C#枚举包含值

我有一个枚举

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

我想写一个函数来testing一个给定的值是否包含在myEnum中

像这样的东西:

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

但是它不起作用,因为myEnum参数不被识别。

不需要自己写:

  // 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); 

顺便说一句 ,创buildgenerics的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 } 

这可以避免所有这些types的东西,并使用强types的值:

 Enum<StringSplitOptions>.IsDefined("None") 

只是使用这种方法

Enum.IsDefined方法 – 返回指定枚举中是否存在具有指定值的常量的指示

 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()... 

不同之处在括号内

  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()); } 

使用枚举的正确名称( myEnum2 )。

此外,如果您正在testingstring值,您可能需要使用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; } 

也可以使用这个:

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

结果将包含该值是否包含在枚举中。

如果你的问题是“我有一个枚举typesenum MyEnum { OneEnumMember, OtherEnumMember } ,我想有一个函数,告诉这个枚举types是否包含具有特定名称的成员,那么你在找什么是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 

如果你的问题是“我有一个枚举types的实例,它有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; } 

希望我能帮上忙。