Как отменить разрешение пользовательских атрибутов?
У меня есть перечисление с пользовательскими атрибутами, что-то вроде:
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.