Как отменить разрешение пользовательских атрибутов?

У меня есть перечисление с пользовательскими атрибутами, что-то вроде:

public enum EnumStatus
{
    [CharValue('*')]
    Empty,

    [CharValue('A')]
    value1,

    [CharValue('P')]
    value2,
}

"прямой" путь кажется легким, если при помощи значения enum получить пользовательский атрибут, используя отражение, GetCustomAttributes и тому подобное.

но я хочу какое-то обратное разрешение. имея значение char, я хочу иметь значение enum для работы.

что-то вроде:

public static Enum GetEnumValue(this Enum source, char value)
{...}

который должен возвращать EnumStatus.value1, если я поставлю 'A' в качестве параметра значения.

есть идеи? я не хочу делать дополнительную хеш-таблицу, откладывая перечисления.

Спасибо огромное!

2 ответа

Решение

Из примера я сделал это здесь:

    public static T GetEnumValue<T, TExpected>(char value) where TExpected : Attribute
    {
        var type = typeof(T);

        if (type.IsEnum)
        {
            foreach (var field in type.GetFields())
            {
                dynamic attribute = Attribute.GetCustomAttribute(field,
                    typeof(TExpected)) as TExpected;

                if (attribute != null)
                {
                    if (attribute.Value == value)
                    {
                        return (T)field.GetValue(null);
                    }
                }
            }
        }

        return default(T);
    }

работает отлично...

Я бы порекомендовал использовать DescriptionAttribute и следуя примеру здесь: /questions/9913010/atribut-get-enum-from-description/9913027#9913027.

Другие вопросы по тегам