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 参数无法识别。

88500 次浏览

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

另外,如果您正在对字符串值进行测试,那么您可能希望使用 GetNames而不是 GetValues

不需要自己写:

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

顺便说一句,创建通用的 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")

只要将枚举设置为:

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

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

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

在本例中,使用 ToString ()所做的是:

相反,你应该写:

Enum.GetValues(typeof(myEnum).ToString()...

不同之处在于括号里..。

如果你的问题是像“我有一个枚举类型,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

如果你的问题是“我有一个 Enum 类型的实例,它有 Flags属性,我想要一个函数来告诉这个实例是否包含一个特定的 enum 值,那么这个函数看起来像这样:

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

希望我能帮上忙。