2011-05-13 34 views
0

喜纔去直接的問題讓我告訴我的代碼:如何確定給定int值屬於哪個枚舉

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

我要的是:第一步已經產生了有效的價值的過程第二步之後。我的意思是值應該在枚舉定義中定義的範圍之間。否則,我不想處理它。例如對於例如

  1. 案例1 - 可以說掩碼值是32, 它在枚舉中定義。所以類型是 獲得價值DEBUGLOG所以它 type.ToString()(即「DEBUGLOG」), 這是一個有效的情況。
  2. case 2-讓 說掩碼值是128,它不是 定義在枚舉中,在這種情況下,我不 想要處理128 值的任何東西。但發生了什麼 類型的輸入值128和 類型.ToString()將它轉換爲128.我不想要這個,我想要 確定是否屬於 枚舉值或不。

我想阻止第二種情況來執行。有沒有解決我的問題?

請讓我知道,如果需要更多的細節。

回答

4

你可以使用Enum.IsDefined,就像這樣:

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

由於它的工作。只需稍做更改Console.WriteLine(Enum.IsDefined(typeof(LogType),(LogType)value)); – vrajs5 2011-05-13 06:36:24

+0

@ vrajs5:很高興知道它有幫助! – alex 2011-05-13 07:37:34

0

我有一個名爲Unconstrained Melody庫,讓你表達這一切在一個類型安全的通用方式,避免過於拳。 個人我更喜歡使用Enum.IsDefined,但顯然不涉及學習一個額外的庫。

它可能不值得使用不受約束的旋律,如果這是你需要與你的枚舉唯一要做的事情,但如果你有其他類似的操作,您不妨考慮一下。

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

一個除了你的代碼可能是添加[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#的枚舉類也有方法GetName()。這可能提供一種很好且容易的方式來檢索數值集的名稱,例如

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

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