Как определить, какое значение int принадлежит какому перечислению - PullRequest
0 голосов
/ 13 мая 2011

Привет, прежде чем приступить к решению проблемы, позвольте мне показать мой код:

//Definition of enum
public enum LogType
{
    Warning = -2,
    Error = -1,
    Info = 0,
    EruCtorDtor = 1,
    Notifications = 2,
    CommunicationWithAOT = 4,
    ExecutedOrder = 8,
    ERUInfo = 16,
    DebugLog = 32,
}

//Use of enum
CurrentLogFlagSettings = nLogFlag;
LogFlagMap = new SortedDictionary<LogType, int>();

ulong mask = 1;
while(mask <= nLogFlag)
{
     if ((nLogFlag & mask) == mask)
     {
          LogType type = (LogType)mask;  //Step 1
          string val = type.ToString(); //Step 2
          //Processing the value
          LogFlagMap.Add(type, tempVal)
          LogMsg(val + " added", type);
      }
      mask <<= 1;
 }

То, что я хочу: Обрабатывать шаг 2 только после того, как шаг 1 выдал допустимое значение.Я имею в виду значение должно быть между диапазоном, определенным в определении enum.В противном случае я не хочу обрабатывать это.например,

  1. case 1 - допустим, значение маски равно 32, оно определено в enum.Таким образом, тип получает значение DebugLog, и поэтому это type.ToString () (то есть "DebugLog"), это допустимый случай.
  2. case 2- Позволяет сказать, что значение маски равно 128 и оно не определено в enum, в этом случае я не хочу обрабатывать что-либо со значением 128.Но то, что происходит, получает значение 128 в типе и типе. ToString () преобразует его в 128. Я не хочу этого, я хочу убедиться, принадлежит ли 128 значениям перечисления или нет.

Я хочу предотвратить выполнение второго дела.Есть ли какое-нибудь решение для моей проблемы?

Пожалуйста, дайте мне знать, если потребуется более подробная информация.

Ответы [ 5 ]

4 голосов
/ 13 мая 2011

Вы можете использовать Enum.IsDefined, вот так:

int value = 128;
Console.WriteLine(Enum.IsDefined(typeof(LogType), value)); // will print out False
3 голосов
/ 13 мая 2011

Во-первых, позвольте мне серьезно извиниться, у меня не было сна, поэтому, если я немного упустил момент.Пожалуйста, просто игнорируйте меня.

Вы можете перечислить свой LogType с помощью Enum.GetValues ​​(typeof (LogType))), чтобы вы могли пройти и проверить значение по нему.У меня был какой-то код, но я не мог обещать, что он скомпилирован.

Bool isValid(int i)
{
  foreach (LogType l in Enum.GetValues(typeof(LogType)))
  {
    if ((int)l == i) return true;
  }
  return false;
}
1 голос
/ 13 мая 2011

Вы также можете использовать Enum.GetValues ​​(typeof (LogType)), чтобы получить все возможные значения для вашего перечисления и делать то, что вы хотите через это.

т.е.

var values = Enum.GetValues(typeof (LogType));
foreach (LogType type in values)
{
    if (((int)type & nLogMask) == (int)type)
    {
        //value is valid, process the value
    }
}
1 голос
/ 13 мая 2011

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

например

[Flags]
public enum LogType
{
    Warning = -2,
    Error = -1,
    Info = 0,
    EruCtorDtor = 1,
    Notifications = 2,
    CommunicationWithAOT = 4,
    ExecutedOrder = 8,
    ERUInfo = 16,
    DebugLog = 32,
}

хотя для этого вам необходимо изменить значения таким образом, чтобы предупреждение и ошибка принимали верхние 2 бита значения перечисления (при условии, что это все еще необходимо).

В классе c # Enum также есть метод GetName () .Это может обеспечить удобный и простой способ получения имени набора значений

например,

Enum.GetName (typeof (LogType), 4);// result = CommunicationWithAOT

0 голосов
/ 13 мая 2011

У меня есть библиотека с именем Unconstrained Melody , которая позволяет вам выразить все это в типичном безопасном родовом виде и избегает также бокса. Лично Я предпочитаю это, чем использовать Enum.IsDefined, но, очевидно, это не подразумевает изучения дополнительной библиотеки.

Возможно, не стоит использовать Unconstrained Melody, если это единственное, что вам нужно сделать с вашим enum, но если у вас есть другие подобные операции, вы можете рассмотреть это.

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