如何获取具有相同值的枚举项的所有名称?

时间:2015-11-09 11:13:29

标签: c# enums

FooBar枚举成员共享相同的关联值180:

public enum EnumShareValues
{
    Default = 0,
    Foo = 180,
    Bar = 180,
}

此代码打印String representation of 'Bar' is 'Foo'这是正确的,它返回第一次出现的值180:

const EnumShareValues bar = EnumShareValues.Bar;
Debug.WriteLine("String representation of 'Bar' is '{0}'", bar);

但它是否有可能获得值为180的枚举项的两个名称? 类似的东西:

// would in this case return "Foo, Bar"
Enum.GetAllNames(typeof(EnumShareValues), EnumShareValues.Bar, ","); 

修改 经过一些测试和摆弄后,我结束了以下代码。谢谢你的所有答案!

public static IEnumerable<string> GetAllNames<T>(T propValue) 
    where T : struct, IConvertible
{
    if (!typeof(T).IsEnum) 
        throw new ArgumentException("T must be an enumerated type");

    var allNames = Enum.GetNames(typeof(T))
        .Where(name => ((T)Enum.Parse(typeof(T), name)).Equals(propValue));

    return allNames;
}

3 个答案:

答案 0 :(得分:2)

您的枚举需要是唯一的,如果您复制了ID,那么您最终会在内部存储以下内容 - 查找包含集合中值的调试窗口。我建议使用一个小的重构代码来容纳。 enter image description here

答案 1 :(得分:1)

内置任何内容,但您可以轻松地将几种不同的方法串联起来:

var allNames =
    Enum.GetNames(typeof (EnumShareValues))
        .Where(name => (EnumShareValues)Enum.Parse(typeof (EnumShareValues), name)
                       == EnumShareValues.Bar);

如果允许我们将通用方法限制为枚举,那么将其作为通用辅助方法进行包装将非常有用。当然,您可以这样做,但如果您尝试将其与非基于枚举的类型一起使用,则会产生运行时错误。

答案 2 :(得分:1)

这种一般的puprose方法有效(fiddle):

我从枚举名称开始并获得相应的值:

public static class Util
{
    public static IEnumerable<string> GetSynonims(this Enum value)
    {
        Type e = value.GetType();   

        return Enum.GetNames(e).Where(n => Enum.Parse(e, n).Equals(value));
    }
}

用法:

Console.WriteLine(String.Join(", ",  EnumShareValues.Bar.GetSynonims()));

打印:

Foo, Bar