关于c#:通过其描述属性查找枚举值

Finding an enum value by its Description Attribute

本问题已经有最佳答案,请猛点这里访问。

这看起来有点颠倒,但我希望能够通过一个枚举的description属性从该枚举中获取一个枚举值。

因此,如果我有一个枚举声明如下:

1
2
3
4
5
6
7
8
9
enum Testing
{
    [Description("David Gouge")]
    Dave = 1,
    [Description("Peter Gouge")]
    Pete = 2,
    [Description("Marie Gouge")]
    Ree = 3
}

我想通过提供"彼得·戈夫"这根绳子来取回2根。

作为起点,我可以迭代枚举字段并使用正确的属性获取字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
string descriptionToMatch ="Peter Gouge";
FieldInfo[] fields = typeof(Testing).GetFields();

foreach (FieldInfo field in fields)
{
    if (field.GetCustomAttributes(typeof(DescriptionAttribute), false).Count() > 0)
    {
        if (((DescriptionAttribute)field.GetCustomAttributes(typeof(DescriptionAttribute), false)[0]).Description == descriptionToMatch)
        {

        }
    }
}

但后来我就一直在想在内心深处该怎么做。也不确定这是不是一开始就要走的路。


使用这里描述的扩展方法:

1
2
3
Testing t = Enum.GetValues(typeof(Testing))
                .Cast<Testing>()
                .FirstOrDefault(v => v.GetDescription() == descriptionToMatch);

如果找不到匹配值,它将返回(Testing)0(您可能希望在枚举中为此值定义None成员)


1
return field.GetRawConstantValue();

当然,如果需要的话,您可以将其转换回测试。


好吧,在输入了所有我认为这是一个决定的案例,从一开始就引导我走上了错误的道路。Enum似乎是正确的开始方式,但是一个简单的Dictionary就足够了,而且非常容易使用!