[英]C# enum contains value
I have an enum 我有一个枚举
enum myEnum2 { ab, st, top, under, below}
I would like to write a function to test if a given value is included in myEnum 我想编写一个函数来测试myEnum中是否包含给定值
something like that: 类似的东西:
private bool EnumContainValue(Enum myEnum, string myValue)
{
return Enum.GetValues(typeof(myEnum))
.ToString().ToUpper().Contains(myValue.ToUpper());
}
But it doesn't work because myEnum parameter is not recognized. 但它不起作用,因为无法识别myEnum参数。
Why not use 为什么不用
Enum.IsDefined(typeof(myEnum), value);
BTW it's nice to create generic Enum<T>
class, which wraps around calls to Enum
(actually I wonder why something like this was not added to Framework 2.0 or later): BTW很高兴创建通用的
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
}
This allows to avoid all this typeof
stuff and use strongly-typed values: 这允许避免这一切
typeof
的东西,并使用强类型的值:
Enum<StringSplitOptions>.IsDefined("None")
No need to write your own: 无需编写自己的:
// 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);
Example: 例:
if (System.Enum.IsDefined(MyEnumType, MyValue))
{
// Do something
}
just use this method 只是使用这种方法
Enum.IsDefined Method - Returns an indication whether a constant with a specified value exists in a specified enumeration Enum.IsDefined Method - 返回指示指定枚举中是否存在具有指定值的常量的指示
Example 例
enum myEnum2 { ab, st, top, under, below};
myEnum2 value = myEnum2.ab;
Console.WriteLine("{0:D} Exists: {1}",
value, myEnum2.IsDefined(typeof(myEnum2), value));
What you're doing with ToString() in this case is to: 在这种情况下,你使用ToString()做的是:
Enum.GetValues(typeof(myEnum)).ToString()...
instead you should write: Enum.GetValues(typeof(myEnum)).ToString()...
而你应该写:
Enum.GetValues(typeof(myEnum).ToString()...
The difference is in the parentheses... 区别在于括号......
Also can use this: 也可以用这个:
enum myEnum2 { ab, st, top, under, below }
static void Main(string[] args)
{
myEnum2 r;
string name = "ab";
bool result = Enum.TryParse(name, out r);
}
The result will contain whether the value is contained in enum or not. 结果将包含值是否包含在枚举中。
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());
}
If your question is like "I have an enum type, enum MyEnum { OneEnumMember, OtherEnumMember }
, and I'd like to have a function which tells whether this enum type contains a member with a specific name, then what you're looking for is the System.Enum.IsDefined
method: 如果您的问题是“我有一个枚举类型,
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
If your question is like "I have an instance of an enum type, which has Flags
attribute, and I'd like to have a function which tells whether this instance contains a specific enum value, then the function looks something like this: 如果你的问题是“我有一个枚举类型的实例,它有
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;
}
Hope I could help. 希望我能提供帮助。
Use the correct name of the enum ( myEnum2
). 使用枚举的正确名称(
myEnum2
)。
Also, if you're testing against a string value you may want to use GetNames
instead of GetValues
. 此外,如果您正在测试字符串值,则可能需要使用
GetNames
而不是GetValues
。
just cast the enum as: 只需将枚举转换为:
string something = (string)myEnum;
and now comparison is easy as you like 现在,比较很容易
I think that you go wrong when using ToString(). 我认为你在使用ToString()时出错了。
Try making a Linq query 尝试制作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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.