gpt4 book ai didi

c# - 位域枚举扩展方法返回包含值的字典

转载 作者:行者123 更新时间:2023-12-02 14:34:15 25 4
gpt4 key购买 nike

枚举肯定会令人困惑。我正在尝试在 Enum 类型上创建一个扩展方法,该方法将接受一个值并返回所有匹配位的名称。

给定:

[Flags]
public enum PlanetsEnum
{
Mercury=1,
Venus=2,
Earth=4,
Mars=8,
Jupiter=16,
//etc....
}

我想创建一个扩展方法,它返回仅包含所选值的字典。所以如果:

PlanetsEnum neighbors = PlanetsEnum.Mars | PlanetEnum.Venus; //10

IDictionary dict = neighbors.ToDictionary();

foreach (KeyValuePair<String, Int32> kvp in dict)
{
Console.WriteLine(kvp.Key);
}

/*
* Should Print:
* Mars
* Venus
*/

我希望看到 Mars 和 Venus 写入控制台,但我看到的是 PlanetEnum 的所有值。这是我的扩展方法代码:

public static IDictionary<string, Int32> ToDictionary(this Enum enumeration)
{
Type type = enumeration.GetType();
return Enum.GetValues(type).Cast&lt;Int32>().ToDictionary(field => Enum.GetName(type, field));
}

有人看到我做错了什么吗?我知道 Enum.GetValues 返回枚举类型的所有字段,如何让它仅返回枚举实例的字段?

非常感谢您的帮助,

基思

最佳答案

这是您想要执行的操作的 LINQ 化版本。您缺少的关键位是检查当前值:

public static IDictionary<string, int> ToDictionary(this Enum enumeration)
{
int value = (int)(object)enumeration;
return Enum.GetValues(enumeration.GetType()).OfType<int>().Where(v => (v & value) == value).ToDictionary(v => Enum.GetName(enumeration.GetType(), v));
}

编辑:关于我们为什么进行 (int)(object)enumeration 转换的一些解释:

位运算符仅适用于整型(如 int)和 bool 值,但 Enum 不能直接转换为 int。因此,我们必须向下转换为一个对象,并假设它实际上表示一个 int 作为基础类型 - 编译器将允许我们将一个对象转换为 int。如果枚举不是基于整数的,这将引发运行时异常。

关于c# - 位域枚举扩展方法返回包含值的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2195679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com