Как мне декодировать биты, чтобы получить исходные значения? - PullRequest
1 голос
/ 27 января 2012

Предполагая, что у меня есть следующее перечисление

[Flags]
enum Options
{
    Option1 = 1 << 0, 
    Option2 = 1 << 1, 
    Option3 = 1 << 2
}

И я должен был установить переменную следующим образом

var options = 0;
options |= Options.Option1; 
options |= Options.Option3; 

// now options should equal Option1 + Option3
// I then store that single value in the database
myDatabase.Options.Submit(options);

Как мне затем разобрать «Опции», чтобы вернуть исходные значения?

public List<Options> ParseOptions(Options options)
{
    // Not sure how to parse the options.
}

Ответы [ 2 ]

6 голосов
/ 27 января 2012

Вы можете использовать метод Enum.HasFlag(), чтобы увидеть, установлен ли определенный флаг. Просто пройдите тестирование всех отдельных значений, если оно установлено.

var value = Options.Option1 | Options.Option3;
foreach (Options flag in Enum.GetValues(typeof(Options)))
{
    if (value.HasFlag(flag))
    {
        // do something with the flag
    }
}

Обратите внимание, что метод HasFlag() был добавлен в .NET 4. Однако он логически эквивалентен этому:

public static bool HasFlag(this Enum value, Enum flag)
{
    return (value & flag) == flag;
}
1 голос
/ 27 января 2012

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

public List<Options> ParseOptions(Options options)      
{
    var list = new List<Options>(); 

    foreach(MyEnum val in Enum.GetValues(typeof(myEnum)))
    {
        if ((val & options) == val)
            List.Add(val);
    }

    return list;
}

(не проверено в Visual Studio)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...