Как создать динамический список флагов перечисления, а затем перейти в другой метод - PullRequest
1 голос
/ 07 ноября 2019

У меня есть сценарий, подобный следующему, у меня есть enum, я получаю некоторый текст, который анализируется для создания списка перечислений, которые я хочу передать в ReportResults, который создаст электронное письмо на основе переданных флагов. У вас нет доступа для изменения enum или метода ReportResults, есть ли способ передать что-то вроде переменной resultFlags? Есть ли способ использовать Enum.TryParse для создания одного элемента для передачи? (должно быть время, когда для сериализации требуется нечто подобное)

    [Flags]
    public enum Result
    {
        None = 0,
        Warning = 2,
        Error = 4,
        Success = 8,
        Failure = 16
    }

    public void ProcessResultValues(string log)
    {
        var resultFlags = new List<Result>();

        /// Process log text, add Result flags to the resultFlags list

        ReportResults(resultFlags);
    }

    public void ReportResults(Result results)
    {
        /// Based on the flags, generate a text to describe if the process succeeded or failed and if there were any warnings or errors encountered during processing.
    }

Ответы [ 2 ]

7 голосов
/ 07 ноября 2019

Так как Result настроен правильно как битовые флаги enum (что означает, что одна переменная перечисления может содержать несколько значений перечисления), вы можете просто or их вместе получить единую комбинацию перечисление , чтобы пройти. Самый простой способ сделать это - использовать Enumerable . Агрегат метод

Применяет функцию накопителя к последовательности.

var result = resultFlags.Aggregate((x, y) => x |= y);

Это то же самое, что комбинировать их вручную, например,

Days meetingDays = Days.Tuesday | Days.Thursday;

Причина, по которой битовые флаги работают, заключается в том, как размечаются числа, каждое значение не является взаимоисключающим и может быть легко упаковано и распаковано в двоичном виде с использованием битовых операций (следовательно,имя битовые флаги ). Они были вокруг навсегда.


Дальнейшее чтение

Типы перечисления в виде битовых флагов

Вы можете использовать тип перечисления дляопределить битовые флаги, что позволяет экземпляру типа перечисления хранить любую комбинацию значений, определенных в списке перечислителей

Вы создаете перечисление битовых флагов, применяя атрибут System.FlagsAttribute и определяя значения соответствующим образомчтобы над ними можно было выполнять побитовые операции AND, OR, NOT и XOR. В перечисление битовых флагов включите именованную константу со значением ноль, что означает «флаги не установлены».

1 голос
/ 07 ноября 2019

Вы можете попробовать это, но значение None должно быть 1, потому что если 0, флаг всегда будет включен.

[Flags]
public enum Result
{
  None = 1,
  Warning = 2,
  Error = 4,
  Success = 8,
  Failure = 16
}

public void ProcessResultValues(string log)
{
  var resultFlags = new List<Result>();

  // For test
  resultFlags.Add(Result.Warning);
  resultFlags.Add(Result.Success);

  Result results = default(Result);
  resultFlags.ForEach(value => results |= value);

  ReportResults(results);
}

public void ReportResults(Result results)
{
  // For test
  foreach ( Enum value in Enum.GetValues(typeof(Result)) )
    if ( results.HasFlag(value) )
      Console.WriteLine(value);
}

Выход

Warning
Success

Если None равно 0:

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