我已使用enum
属性定义了[Flag]
。
给定一个整数值,我想打印整数值中设置的所有enum
值。
这是我到目前为止所拥有的。
string s = string.Join(", ", Enum.GetValues(typeof(MyEnumType)).OfType<Enum>()
.Where(x => (MyIntValue & (int)x) != 0));
但是最后一行中int
的类型转换给了我以下错误。
无法转换类型&#39; System.Enum&#39;到&#39; int&#39;
我希望Microsoft能够替换所有返回Array
的框架代码,转而支持支持LINQ的类型。
但有一种简单的方法吗?
答案 0 :(得分:3)
转换为MyEnumType
而不是通用Enum
应解决问题:
string s = string.Join(
", ",
Enum.GetValues(typeof(MyEnumType))
.OfType<MyEnumType>()
.Where(x => (MyIntValue & (int)x) != 0));
您确实应该使用Cast
而不是OfType
,因为您确定这些项目的类型为MyEnumType
。
答案 1 :(得分:2)
太多的LINQ思维方式,所以有时我们会忘记它们来自哪里:)从第一个.NET版本开始,Enum.GetValues(typeof(MyEnum))
实际上返回MyEnum[]
,所以你需要的不是{{ 1}},也不是OfType
,而是简单的C#Cast
:
cast
因为string s = string.Join(", ", ((MyEnum[])Enum.GetValues(typeof(MyEnumType)))
.Where(x => (MyIntValue & (int)x) != 0));
加上相同类型的演员是非常讨厌的,很长一段时间我在口袋里都有这个小帮手:
typeof
允许我使用更简洁的
public static class EnumInfo
{
public static T[] GetValues<T>() where T : struct // I (and not only) wish I could say where T : enum
{
return (T[])Enum.GetValues(typeof(T));
}
}
答案 2 :(得分:0)
您可以编写自己的GetValues方法,使用泛型来获得所需内容:
public static class EnumUtil
{
public static IEnumerable<T> GetValues<T>()
{
foreach(T enumVal in Enum.GetValues(typeof(T)))
{
yield return enumVal;
}
}
}
然后使用它:
var s = string.Join(", ", EnumUtil.GetValues<TestEnum>()
.Where(x => (myIntValue & (int)x) != 0));