Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > [Flags]Enum


Автор: ДобренькийПапаша 18.5.2011, 19:47
Через метод получаю некий код, представленный как int.
Есть перечисление c атрибутом Flags, каждому имени в перечислении соответствует конкретное int значение.

Мне нужно найти пересечение пунктов перечисления, которые дают в результате тот самый, полученный в начале через метод код (он является пересечением каких-то значений из перечисления).

Код

[Flags]
    public enum ReturnCode
    {
    FailureAlarm = 8192,
        ErrorCardBinIsFull = 4096,
        CardIsDispensing = 2048,
        CardIsCapturing = 1024,
        CardDispenseError = 512,
        CardCaptureError = 256,
        NoCapture = 128,
    CardPreEmpty = 16
//Ещё десяток значений
}


Нужно найти то, из каких пунктов перечисления (их пересечение) состоит полученный через метод код и вывести одно за другим эти пункты перечисления.

Например, если я через метод получаю значение 272, то этот код означает пересечение пунктов CardCaptureError и CardPreEmpty, т.е. 256 | 16. Надо вывести на консоль соотвественно CardCaptureError и CardPreEmpty.

Автор: Ky7m 18.5.2011, 20:50
Ну можно на возвращаемый результат накладывать маску и смотреть наличие определенного значения.
То есть 272 = 0000 0001 0001 0000 
             16   = 0000 0000 0001 0000
             256 = 0000 0001 0000 0000

Побитовое И вернет 1 если есть пересечение.

Автор: -Mikle- 19.5.2011, 07:17
Просто приведи тип int к типу ReturnCode.

Код

int numCode = 272;
ReturnCode retCode = (ReturnCode)numCode;
Console.WriteLine(retCode.ToString()); // выведет строку "CardCaptureError, CardPreEmpty"

Проверить наличие флага можно так:
Код

if( (retCode & ReturnCode.CardCaptureError) == ReturnCode.CardCaptureError ) { ...... }

Получить список выставленных флагов:
Код

int numCode = 272;
ReturnCode retCode = (ReturnCode)numCode;
List<ReturnCode> result = new List<ReturnCode>();
foreach (ReturnCode flag in Enum.GetValues(typeof(ReturnCode)))
    if ((retCode & flag) == flag)
        result.Add(flag);
// после выполнения в result будет два флага.

Чтобы упростить себе жизнь, если ты это часто используешь, напиши extension-метод для Enum и используй с любым перечислением.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)