我正在尝试创建一个辅助方法来列出枚举值中设置的所有位的名称(用于记录目的)。我想要一个方法来返回在某些变量中设置的所有枚举值的列表。在我的例子中
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
我喂它 0x81,它应该为我提供一个IEnumerable<HWResponse>
包含{Ready, Error}
.
由于我没有找到更简单的方法,所以我尝试编写下面的代码,但无法编译。
public static IEnumerable<T> MaskToList<T>(Enum mask)
{
if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
throw new ArgumentException();
List<T> toreturn = new List<T>(100);
foreach(T curValueBit in Enum.GetValues(typeof (T)).Cast<T>())
{
Enum bit = ((Enum) curValueBit); // Here is the error
if (mask.HasFlag(bit))
toreturn.Add(curValueBit);
}
return toreturn;
}
在这个版本的代码中,编译器抱怨它不能将 T 转换为 Enum。
我做错什么了?有没有更好(更简单)的方法来做到这一点?我怎么能做演员?
另外,我尝试将方法编写为
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
但 Enum 是一种特殊类型,禁止使用“where”语法(使用 C# 4.0)