如何识别给定的int值属于哪个枚举

时间:2011-05-13 06:26:21

标签: c# .net enums

嗨,在转到直接问题之前让我展示我的代码:

//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;
 }

我想要的是:仅在step1产生有效值后才处理step2。我的意思是值应该在枚举定义中定义的范围之间。否则我不想处理它。 例如

  1. 案例1 - 假设掩码值为32, 它在枚举中定义。所以类型是 获取值DebugLog等等 type.ToString()(即“DebugLog”), 这是一个有效的案例。
  2. 案例2-让我们 说掩码值是128而不是 在枚举中定义,在这种情况下,我不 想在128上处理任何事情 值。但是它正在发生什么 类型和中的128值 type.ToString()正在转换它 到128.我不想要这个,我想要 确定128是否属于 枚举值与否。
  3. 我想防止第二种情况被执行。我的问题有解决办法吗?

    如果需要更多详细信息,请与我们联系。

5 个答案:

答案 0 :(得分:4)

您可以使用Enum.IsDefined,如下所示:

int value = 128;
Console.WriteLine(Enum.IsDefined(typeof(LogType), value)); // will print out False

答案 1 :(得分:3)

首先,让我严重道歉,我已经不喜欢睡觉,所以如果我错过了一点点。拜托,请忽略我。

您可以使用Enum.GetValues(typeof(LogType))枚举您的LogType,这样您就可以单步执行并检查一个值。我有一些代码,但是,我不能保证它已编译。

Bool isValid(int i)
{
  foreach (LogType l in Enum.GetValues(typeof(LogType)))
  {
    if ((int)l == i) return true;
  }
  return false;
}

答案 2 :(得分:1)

您的代码的一个附加功能可能是为您枚举添加了[Flags]属性,这就清楚地表明枚举值是针对按位运算的

e.g。

[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()。这可能提供了一种检索值集名称的简便方法

e.g。

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

答案 3 :(得分:1)

您还可以使用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
    }
}

答案 4 :(得分:0)

我有一个名为Unconstrained Melody的库,它允许您以类型安全的通用方式表达所有这些,并避免装箱。 个人我更喜欢使用Enum.IsDefined,但显然不需要学习额外的库。

如果这是你需要对枚举进行的唯一操作,那么可能不值得使用Unconstrained Melody,但是如果你有其他类似的操作,你可能希望考虑它。