我有一个枚举
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参数无法识别。
Answer 1:
无需编写自己的:
// 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
}
Answer 2:
为什么不使用
Enum.IsDefined(typeof(myEnum), value);
顺便说一句这是很好的创建通用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")
Answer 3:
只需使用此方法
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));
Answer 4:
什么你对于这种情况下的ToString()做的事情就是:
Enum.GetValues(typeof(myEnum)).ToString()...
而不是你应该写:
Enum.GetValues(typeof(myEnum).ToString()...
所不同的是括号中的...
Answer 5:
也可以使用此:
enum myEnum2 { ab, st, top, under, below }
static void Main(string[] args)
{
myEnum2 r;
string name = "ab";
bool result = Enum.TryParse(name, out r);
}
其结果将包含值是否包含在枚举与否。
Answer 6:
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());
}
Answer 7:
如果你的问题是像“我有一个枚举类型, 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;
}
希望我能帮上忙。
Answer 8:
使用枚举(正确名称myEnum2
)。
此外,如果你对一个字符串值,测试你可能想使用GetNames
代替GetValues
。
Answer 9:
只投枚举为:
string something = (string)myEnum;
现在比较容易的,只要你喜欢
Answer 10:
我认为你使用的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;
}
文章来源: C# enum contains value