Подпись к элементам Enum
От: dimchick Украина  
Дата: 22.11.06 09:57
Оценка:
Народ, мож кто знает как поменять текст, получаемый от Enum.ToString()? Может атрибутом каким то:
enum SomeEnum {
[Description("bla-bla-bla1")]
el1,

[Description("bla-bla-bla2")]
el2
}

foreach( object i in Enum.GetValues( typeof(SomeEnum) ) )
  Console.WriteLine( i );


Вместо el1 и el2 хочу увидеть
bla-bla-bla1
bla-bla-bla2



ЗЫ. Есть вариант засунуть элементы перечисления в котейнер, но это не шибко удобно в использовании.
Re: Подпись к элементам Enum
От: Воронков Василий Россия  
Дата: 22.11.06 10:05
Оценка:
Здравствуйте, dimchick, Вы писали:

D>Народ, мож кто знает как поменять текст, получаемый от Enum.ToString()? Может атрибутом каким то:


Никак. Только AnotherClass.ToString(MyEnum)
Re: Подпись к элементам Enum
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 22.11.06 10:16
Оценка: 2 (1)
Здравствуйте, dimchick, Вы писали:

D>Народ, мож кто знает как поменять текст, получаемый от Enum.ToString()? Может атрибутом каким то:


enum SomeEnum {
[Description("bla-bla-bla1")]
el1,

[Description("bla-bla-bla2")]
el2
}


как-то так:

foreach( object i in Enum.GetValues( typeof(SomeEnum) ) )
  Console.WriteLine( (new EnumTypeConverter(typeof(SomeEnum))).ConvertToString(i) );


где:

   /// <summary>
   /// TypeConverter для Enum, преобразовывающий Enum к строке с
   /// учетом атрибута Description
   /// </summary>
   class EnumTypeConverter : EnumConverter
   {
         private Type _EnumType;
         /// <summary>
         /// Инициализирует экземпляр
         /// </summary>
         /// <param name="type">тип Enum</param>
         public EnumTypeConverter( Type type ) : base( type )
         {
            _EnumType = type;
         }

         public override bool CanConvertTo( ITypeDescriptorContext context,
                                            Type destType )
         {
            return destType == typeof ( string );
         }

         public override object ConvertTo( ITypeDescriptorContext context,
                                           CultureInfo culture,
                                           object value, Type destType )
         {
            FieldInfo fi = _EnumType.GetField( Enum.GetName( _EnumType, value ) );
            DescriptionAttribute dna =
               ( DescriptionAttribute ) Attribute.GetCustomAttribute(
                  fi, typeof( DescriptionAttribute ) );

            if ( dna != null )
               return dna.Description;
            else
               return value.ToString();
         }

         public override bool CanConvertFrom( ITypeDescriptorContext context,
                                              Type srcType )
         {
            return srcType == typeof ( string );
         }

         public override object ConvertFrom( ITypeDescriptorContext context,
                                             CultureInfo culture,
                                             object value )
         {
            foreach ( FieldInfo fi in _EnumType.GetFields() )
            {
               DescriptionAttribute dna =
                  ( DescriptionAttribute ) Attribute.GetCustomAttribute(
                     fi, typeof( DescriptionAttribute ) );

               if ( ( dna != null ) && ( ( string ) value == dna.Description ) )
                  return Enum.Parse( _EnumType, fi.Name );
            }

            return Enum.Parse( _EnumType, ( string ) value );
         }

   }
... << RSDN@Home 1.2.0 alpha rev. 662>>
Re: Подпись к элементам Enum
От: ybouts  
Дата: 22.11.06 10:29
Оценка:
Здравствуйте, dimchick, Вы писали:

посмотри здесь
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Подпись к элементам Enum
От: dimchick Украина  
Дата: 22.11.06 12:10
Оценка:
Здравствуйте, ybouts, Вы писали:

Y>Здравствуйте, dimchick, Вы писали:


Y>посмотри здесь


Да, такого аттрибута быть не может, потому как хардкодить строки не есть хорошо. Особенно когда пишешь приложение, которое поддерживает несколько языков.
Вобщем каждый пишет как ему удобно.
Re[2]: Подпись к элементам Enum
От: _FRED_ Черногория
Дата: 22.06.09 06:12
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>как-то так:


OE>foreach( object i in Enum.GetValues( typeof(SomeEnum) ) )
OE>  Console.WriteLine( (new EnumTypeConverter(typeof(SomeEnum))).ConvertToString(i) );


Конвертер надо или один раз получить перед циклом или каждый раз, но не от типа, а от объекта ("i"). И получать его нужно не через new, а через TypeDescriptor.GetConverter():

var converter = TypeDescriptor.GetConverter(typeof(SomeEnum));
foreach( object i in Enum.GetValues( typeof(SomeEnum) ) )
  Console.WriteLine( TypeDescriptor.GetConverter(i).ConvertToString(i) );


Если уж мы пометили значения в нашем enumе через DescriptionAttribute, то и добавить к enumу TypeConverter(typeof(EnumTypeConverter)) будет возможно.

OE>где:

OE>            FieldInfo fi = _EnumType.GetField( Enum.GetName( _EnumType, value ) );
OE>            DescriptionAttribute dna =
OE>               ( DescriptionAttribute ) Attribute.GetCustomAttribute(
OE>                  fi, typeof( DescriptionAttribute ) );


Так же касается и ConvertFrom.
Тут не обрабатывается много специфичных для enum операций: значение может быть явно и не описано. Исключение в таком случае — это не совсем то, что ожидают пользователи.

var attributes = TypeDescriptor.GetAttributes(value);
var attribute = attributes[typeof(DescriptionAttribute)];
if(attribute != null && !String.IsNullOrEmpty(attribute.Description)) {
  return attribute.Description;
}//if
return Convert.ToString(value);


Да и Flags не мешало бы как-то продумать. Базовый класс его обрабатывает.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Подпись к элементам Enum
От: _FRED_ Черногория
Дата: 22.06.09 07:25
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>var attributes = TypeDescriptor.GetAttributes(value);
_FR>var attribute = attributes[typeof(DescriptionAttribute)];


Здесь я наврал. Без получения поля и атрибута по полю не обойтись
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.