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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверка флага в enum 
V
    Опции темы
nmn
Дата 26.1.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



проблема с проверкой флагов в перечислениях, вернее в удобстве такой проверки
поэтому хочется сделать что то вроде
Код

static class FlagEnumHelper
{
 public static bool isSet(... src, ... flag)
}

собственно проблема, что нужно вместо троеточия, чтобы работало со всеми перечислениями?
PM Skype   Вверх
Anyone
Дата 26.1.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Возможно, object
PM MAIL   Вверх
nmn
Дата 26.1.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не дописал, должно быть так
Код

static class FlagEnumHelper
{
 public static bool isSet(... src, ... flag)
{
return (src&flag)==flag;
}
}

PM Skype   Вверх
mihryak
Дата 26.1.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



а интами разве не катит?
Код

        [Flags]
        enum Test
        {
            A = 1,
            B = 2,
            C = 4
        }

        private static bool TestEnum(int value, int flag)
        {
            return (value & flag) == flag;
        }

        static void Main(string[] args)
        {
            Test test = Test.A | Test.B;
            Console.WriteLine(TestEnum((int) test, (int) Test.B));
            Console.WriteLine(TestEnum((int)test, (int)Test.C));
            Console.WriteLine(TestEnum((int)test, (int) (Test.A | Test.B)));
            Console.WriteLine(TestEnum((int)test, (int)(Test.A | Test.C)));

            Console.ReadKey();
        }

PM MAIL ICQ   Вверх
Anyone
Дата 26.1.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я так понял, flag - это маска, то есть переменная целого типа и функция возвратит true тогда и только тогда, когда все биты с значением 1 источника и маски совпадут, при этом где у маски ноль - у источника может быть что годно. В таком случае src должен иметь такой же тип. Или я что-то не так понял?
PM MAIL   Вверх
nmn
Дата 26.1.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mihryak @ 26.1.2009,  23:01)
а интами разве не катит?
Код

        [Flags]
        enum Test
        {
            A = 1,
            B = 2,
            C = 4
        }

        private static bool TestEnum(int value, int flag)
        {
            return (value & flag) == flag;
        }

        static void Main(string[] args)
        {
            Test test = Test.A | Test.B;
            Console.WriteLine(TestEnum((int) test, (int) Test.B));
            Console.WriteLine(TestEnum((int)test, (int)Test.C));
            Console.WriteLine(TestEnum((int)test, (int) (Test.A | Test.B)));
            Console.WriteLine(TestEnum((int)test, (int)(Test.A | Test.C)));

            Console.ReadKey();
        }

приводить типы, оно то конечно можно и наверное так и буду делать если не найдется обходной вариант
идеально было бы через обобщения, но компилятору не нравится битовая операция :(
PM Skype   Вверх
mihryak
Дата 26.1.2009, 23:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



можно и с обобщениями, через небольшой хак в обмен на строгую типизацию

Код

        private static bool TestEnum<T>(T value, T flag) where T : struct
        {
            if (!value.GetType().IsEnum || !flag.GetType().IsEnum)
            {
                throw new ArgumentException("Invalid enum type");
            }

            return (Convert.ToInt32(value) & Convert.ToInt32(flag)) == Convert.ToInt32(flag);
        }

Код

Console.WriteLine(TestEnum<Test>(test, Test.B));


Это сообщение отредактировал(а) mihryak - 26.1.2009, 23:20
PM MAIL ICQ   Вверх
diadiavova
Дата 26.1.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(nmn @  26.1.2009,  22:52 Найти цитируемый пост)
return (src&flag)==flag;

Я что-то вообще не пойму, почему это вдруг должно заработать. 
Я бы вместо этого попробовал сделать так
Код

return (src|flag)^src==0;



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
mihryak
Дата 26.1.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(diadiavova @  27.1.2009,  00:21 Найти цитируемый пост)
Цитата(nmn @  26.1.2009,  22:52 Найти цитируемый пост)
return (src&flag)==flag;
Я что-то вообще не пойму, почему это вдруг должно заработать. 


10010111 - src
AND
00010010 - flag
==
00010010 - == flag

10010111 - src
AND
00011010 - flag
==
00010010 - != flag

PM MAIL ICQ   Вверх
diadiavova
Дата 26.1.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



mihryak, Надо же, и правда работает  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
nmn
Дата 27.1.2009, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mihryak @ 26.1.2009,  23:19)
можно и с обобщениями, через небольшой хак в обмен на строгую типизацию

Код

        private static bool TestEnum<T>(T value, T flag) where T : struct
        {
            if (!value.GetType().IsEnum || !flag.GetType().IsEnum)
            {
                throw new ArgumentException("Invalid enum type");
            }

            return (Convert.ToInt32(value) & Convert.ToInt32(flag)) == Convert.ToInt32(flag);
        }

Код

Console.WriteLine(TestEnum<Test>(test, Test.B));

мда, уж лучше приводить к int сразу, чем пройти через проверки типов и все равно приводить smile
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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