2012-04-13 1 views
0

у меня есть перечисление с пользовательскими атрибутами, что-то вроде:Как отменить разрешение настраиваемых атрибутов?

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

    [CharValue('A')] 
    value1, 

    [CharValue('P')] 
    value2, 
} 

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

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

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

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

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

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

большое спасибо!

ответ

1

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

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); 
    } 

прекрасно работает ...

0

Я бы рекомендовал использовать DescriptionAttribute и следующим примером: https://stackoverflow.com/a/4367868/905651.

+0

Большое спасибо! Атрибут описания по умолчанию уже используется. Поэтому мне нужен другой способ. Но, возможно, я смогу использовать этот пример. Он не обязательно должен быть общим, но мне нужны «общие» атрибуты. –

+0

из примера я сделал это здесь: общественности статической Т GetEnum (значение символов) { вар типа = TypeOf (Т); , если (type.IsEnum) { Еогеасп (вар поле в type.GetFields()) { атрибут вар = Attribute.GetCustomAttribute (поле, TypeOf (CharValueAttribute)) в качестве CharValueAttribute; если (атрибут! = Null) { если (атрибут.Value == значение) возвращение (T) field.GetValue (null); } } } return default (T); } –

 Смежные вопросы

  • Нет связанных вопросов^_^