【发布时间】:2012-04-11 18:48:56
【问题描述】:
我正在尝试创建一个辅助方法来列出枚举值中设置的所有位的名称(用于记录目的)。我想要一个方法来返回在某些变量中设置的所有枚举值的列表。在我的例子中
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
我喂它 0x81,它应该为我提供一个包含 {Ready, Error} 的 IEnumerable<HWResponse>。
由于没有找到更简单的方法,所以尝试编写下面的代码,但无法编译。
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)
【问题讨论】:
-
这似乎不应该是一个标志枚举;这些组合没有意义。可以同时“工作”和“就绪”吗?
-
@DBM:这是真的,这只是一个愚蠢的例子
-
@All:感谢您的精彩回答。三个都很有用!
标签: c# generics enums enumeration