Поиск значения перечисления по его атрибуту описания

Это может показаться немного перевернутым, но то, что я хочу сделать, это получить значение enum из перечисления с помощью атрибута Description.

Итак, если у меня есть перечисление, объявленное следующим образом:

enum Testing
{
    [Description("David Gouge")]
    Dave = 1,
    [Description("Peter Gouge")]
    Pete = 2,
    [Description("Marie Gouge")]
    Ree = 3
}

Я бы хотел получить 2 обратно, предоставив строку "Peter Gouge".

В качестве отправной точки я могу выполнить итерацию по полям перечисления и захватить поле с правильным атрибутом:

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)
        {

        }
    }
}

Но тогда я зациклился на том, что делать в этом внутреннем if. Также не уверен, что это путь в первую очередь.

Ответ 1

Используя описанный метод расширения здесь:

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

Если совпадающее значение не найдено, оно вернет (Testing)0 (вы можете определить член None в своем перечислении для этого значения)

Ответ 2

return field.GetRawConstantValue();

Конечно, вы могли бы вернуть его на тестирование, если это необходимо.

Ответ 3

Хорошо, набрав все, что я думаю, это случай решения в начале, что привело меня к неправильному пути. Enum казался правильным способом начать, но простого Dictionary<string, int> хватит и будет намного проще работать с!