PPC*_*PPC 11 c# generics enums enumeration
我正在尝试创建一个帮助方法来列出Enum值中设置的所有位的名称(用于记录目的).我想要一个方法,它将返回一些变量中设置的所有枚举值的列表.在我的例子中
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
Run Code Online (Sandbox Code Playgroud)
我喂它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;
}
Run Code Online (Sandbox Code Playgroud)
在这个版本的代码中,编译器抱怨它无法将T强制转换为Enum.
我做错了什么?有更好(更简单)的方法吗?我怎么能演员?
另外,我试着把方法写成
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
Run Code Online (Sandbox Code Playgroud)
但Enum属于一种禁止'where'语法的特殊类型(使用C#4.0)
Gab*_*abe 21
这是使用LINQ编写它的简单方法:
public static IEnumerable<T> MaskToList<T>(Enum mask)
{
if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
throw new ArgumentException();
return Enum.GetValues(typeof(T))
.Cast<Enum>()
.Where(m => mask.HasFlag(m))
.Cast<T>();
}
Run Code Online (Sandbox Code Playgroud)
我花了一些时间搜索如何将 Flags 枚举值转换为 List。我找到了非常简单的解决方案,也许会对某人有所帮助。
[Flags]
public enum Tag
{
None = 0,
Stablecoin = 1,
NativeTokens = 2,
Dex = 4
}
Run Code Online (Sandbox Code Playgroud)
var values = Tag.Stablecoin | Tag.Dex;
var str = values.ToString(); //"Stablecoin, Dex"
var list = uniqueNftTagsV2.Split(", "); //{"Stablecoin","Dex"}
Run Code Online (Sandbox Code Playgroud)