Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Энумераторы, Как их правильно готовить? 
:(
    Опции темы
ivashkanet
  Дата 23.6.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата
-- Вам не нравяться Кошки?
-- Вы просто не умеете их готовить  smile 

Не умею, но очень хочу научиться smile 

Ситуация такая: 
У класса есть поле, которое принимет только несколько значений (будем практиковаться на ... кошках): "черный кот", "белый кот", "рыжий кот". 
Для выбора значения удобнее использовать энумератор. Но в значение самого поля хотелось бы записывать строку с "именем" кота. 
Думаю обернуть это все в property, вот так:
Код

class MyClass
    {
        public enum Cats
        {
            Black,
            White,
            RedHaired
        }
        private string _cat;
        public Cats Cat
        {
            get
            {
                switch (_cat)
                {
                    case "Black cat":
                        return Cats.Black;
                    case "White cat":
                        return Cats.White;
                    default:
                        return Cats.RedHaired;
                }
            }
            set
            {
                switch (value)
                {
                    case Cats.Black:
                        _cat = "Black cat";
                        break;
                    case Cats.White:
                        _cat = "White cat";
                        break;
                    default:
                        _cat = "Red-haired cat";
                        break;
                }
            }
        }
    }

Но что то мне не нравиться идея со switch. Что посоветуете?
Нашел такую штуку:
Код

            string s = MyClass.Cats.RedHaired.ToString();
            MyClass.Cats c = (MyClass.Cats)Enum.Parse(typeof(MyClass.Cats), "Black");

В принципе она поможет избавится от switch. А если мне нужно записать в строку не имя энума, а что нибудь другое? Как в примере 
Cats.Black = "Black cat" (вся проблемма в пробеле  smile )

Но может есть что получше?
Жду ваших комментариев.


 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 23.6.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Можно поставить над каждым элементом перечисления атрибут с именем кота, и дёргать его через GetCustomAttribute(). Проигрыш по сравнению с Enum.Parse небольшой, т.к. и в том и в другом случаях используется рефлекшн. Зато избавляемся от switch.

P.S. лучше не "энумератор", а "перечисление", иначе легко спутать с "итератором".

P.S.(2) позволю себе обратить внимание на форму глаголов:

Цитата(ivashkanet @  23.6.2006,  09:48 Найти цитируемый пост)
Но что то мне не нравиться идея со switch.

правильно:
"что делает? - не нравится"
неправильно:
"что делаеть? - не нравиться"

Цитата(ivashkanet @  23.6.2006,  09:48 Найти цитируемый пост)
В принципе она поможет избавится от switch.

правильно:
"поможет что сделать? - избавиться"
неправильно:
"поможет что сделат? - избавится" 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 23.6.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  23.6.2006,  09:55 Найти цитируемый пост)
Можно поставить над каждым элементом перечисления атрибут с именем кота, и дёргать его через GetCustomAttribute().

Можно поподробнее, я не понял smile 
Код

 public enum Cats    
        {    
            [attribute("Black cat")]
            Black,    
            White,    
            RedHaired    
        }

Что-то типа такого? (хотя оно не пашет  smile )
Цитата(mr.DUDA @  23.6.2006,  09:55 Найти цитируемый пост)
P.S.(2) позволю себе обратить внимание на форму глаголов

Блин  smile , смотрел же smile Но все равно проворонил  smile  
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 23.6.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ivashkanet @  23.6.2006,  10:05 Найти цитируемый пост)
Можно поподробнее, я не понял  

 public enum Cats     
        {     
            [attribute("Black cat")]    
            Black,     
            White,     
            RedHaired     
        }    

Что-то типа такого? (хотя оно не пашет   


Не совсем. Счас студию поставлю, тогда примерчик будет. 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 23.6.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  23.6.2006,  10:14 Найти цитируемый пост)
 Счас студию поставлю, тогда примерчик будет.

Неееет, не ставь. Мы ж договорились. Нееееттттт......
Напиши, что помнишь. Я потом сам дойду smile  
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 23.6.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вот:
Код
using System;
using System.Reflection;


// атрибут "Имя кота" - название и содержание выбрано от балды
public class CatNameAttribute : Attribute
{
    public CatNameAttribute(string catName)
    {
        _catName = catName;
    }

    private string _catName;
    public string CatName
    {
        get
        {
            return _catName;
        }
    }
}


// твой класс с котами
public class MyClass
{
    public enum Cats
    {
        [CatName("Black cat")]
        Black,
        [CatName("White cat")]
        White,
        [CatName("Red haired cat")]
        RedHaired
    }


    string _catName = null;
    /// <summary>
    /// Возвращает имя кота, вычисляет его из Cats по необходимости.
    /// </summary>
    public string CatName
    {
        get
        {
            if (_catName == null)
            {
                // выглядит жутко, но работает!
                CatNameAttribute attr = (CatNameAttribute)(_catEnum.GetType().GetField(_catEnum.ToString()).GetCustomAttributes(typeof(CatNameAttribute), false)[0]);
                _catName = attr.CatName;
            }
            return _catName;
        }
    }

    Cats _catEnum;
    /// <summary>
    /// Присваивает/возвращает тип кота. Сбрасывает имя кота в null.
    /// </summary>
    public Cats Cat
    {
        get
        {
            return _catEnum;
        }
        set
        {
            _catEnum = value;
            _catName = null; // будет вычислено при следующем обращении к св-ву CatName
        }
    }
}


// тестовая прога
class Program
{
    static void Main(string[] args)
    {
        MyClass obj = new MyClass();

        obj.Cat = MyClass.Cats.Black;
        Console.WriteLine(obj.CatName);

        obj.Cat = MyClass.Cats.RedHaired;
        Console.WriteLine(obj.CatName);
    }
}
 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 23.6.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



mr.DUDA,  smile Ужас.
Ничего себе решеньеце
А проще ни-ни?
Уж лучше switch-ем smile  
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 23.6.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ivashkanet @  23.6.2006,  11:25 Найти цитируемый пост)
mr.DUDA,   Ужас.
Ничего себе решеньеце
А проще ни-ни?
Уж лучше switch-ем   

там только одна строчка представляет для тебя сложность ?

З.Ы. свитчем имхо кривее - нужно поддерживать get/set (любое изменение енума приведёт к необходимости править и get, и set), а тут - только поставил атрибут, и всё.  


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 23.6.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  23.6.2006,  12:32 Найти цитируемый пост)
там только одна строчка представляет для тебя сложность ?

Это еще нужно будет показать заказчику  smile 
А он у меня строптивый. 
Неужели это стандартный выход? 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 23.6.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Рефлекшн юзают в случае, когда описание в виде метаданных убирает повторяющиеся/дублирующие куски кода. 


--------------------
user posted image
PM MAIL WWW   Вверх
Хоббит
Дата 23.6.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



гы .. мне кажется просто не раздавать имена котам или там энуму ... а искать другой выход... он по любому есть.. чем расставлять атрибуты
 
PM MAIL   Вверх
Void
Дата 23.6.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Хоббит, а чем не нравится решение с атрибутами? Это почти что стандартный подход. Например, BLToolkit использует атрибуты членов enum для OR-маппинга. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Exception
Дата 23.6.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Цитата(ivashkanet @  23.6.2006,  13:51 Найти цитируемый пост)
Это еще нужно будет показать заказчику


А что, он боится reflection, что ли? Ну выдели эту строчку в отдельную функцию - будет менее страшно.. 
PM   Вверх
mr.DUDA
Дата 23.6.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Exception @  23.6.2006,  18:53 Найти цитируемый пост)
А что, он боится reflection, что ли? Ну выдели эту строчку в отдельную функцию - будет менее страшно.. 

Гы, ivashkanet, пора заводить собственную библиотеку "Ivashkanet.PrivateHelpers.dll" - не для глаз заказчика, ё-моё smile  


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1029 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.