2

枚举肯定会令人困惑。我正在尝试在 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是返回枚举类型的所有字段,我如何让它只返回枚举实例的字段?

非常感谢您的帮助,

基思

4

3 回答 3

3

这是您尝试执行的 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)和布尔值,但 Enum 不能直接转换为 int。所以我们必须向下转换为一个对象,并假定它实际上将一个 int 表示为底层类型——编译器将允许我们将一个对象转换为一个 int。如果枚举不是基于整数的,这将引发运行时异常。

于 2010-02-03T21:57:00.657 回答
2

试试下面的。它仅适用于 int32 的枚举

public static IDictionary<String, Int32> ToDictionary(this Enum enumeration)
{
    var map = new Dictionary<string, int>();
    var value = (int)(object)enumeration;
    var type = enumeration.GetType();
    foreach (int cur in Enum.GetValues(type))
    {
        if (0 != (cur & value))
        {
            map.Add(Enum.GetName(type, cur),cur);
        }
    }
    return map;
}
于 2010-02-03T21:49:23.483 回答
1
public enum CustomerType
{
    Standard = 0,
    Trade = 1
}

ddCustomerTypes.DataSource = (new Domain.CustomerType()).ToDictionary();
ddCustomerTypes.DataBind();

public static class EnumExtensionMethods
{
    public static Dictionary<string, object> ToDictionary(this Enum enumeration)
    {
        Array names = Enum.GetNames(enumeration.GetType());

        Dictionary<string, object> dictionary = new Dictionary<string, object>();

        foreach (string name in names)
        {
            dictionary.Add(name, typeof(Domain.CustomerType).GetField(name).GetRawConstantValue() );
        }

        return dictionary;
    }

    public static List<KeyValuePair<string, object>> ToList(this Enum enumObject)
    {
        return enumObject.ToDictionary().ToList();
    }
}
于 2011-07-07T07:24:40.007 回答