2010-09-08 56 views
25

我有一個標記的枚舉,並需要檢索設置的所有值的名稱。最有效的方法來解析一個標記的枚舉到列表

我目前正在利用枚舉的ToString()方法,它返回逗號分隔的元素。

public void SetRoles(Enums.Roles role) 
    { 
     IList<Entities.Role> roleList = role.ToString("G").Split(',') 
      .Select(r => new Entities.Role(r.Trim())) 
      .ToList(); 
    ... 
    } 

我確定必須有比這更好的方法。

+0

很高興知道像這樣的東西存在 - 枚舉的ToString()方法返回元素逗號分隔。你讓我今天一整天都感覺很好 :)。 +1。 – RBT 2016-12-22 07:43:01

回答

22

好問題!

我想不出更好的東西比:

public void SetRoles(Enums.Roles role) 
{ 
    List<string> result = new List<string>(); 
    foreach(Roles r in Enum.GetValues(typeof(Roles)) 
    { 
    if ((role & r) != 0) result.Add(r.ToString()); 
    } 
} 
+3

在.net4中用'(role&r)== r'或'role.HasFlag(r)'替換'(role&r)!= 0'。並確保分配的值是2的冪,否則將失敗。請參閱http://stackoverflow.com/questions/8447/enum-flags-attribute – 2013-01-08 14:05:06

+8

下面是相同的單行版本:'Enum.GetValues(typeof(Roles))。Cast ().Where(r => (role&r)== r).Select(r => r.ToString())' – Ondra 2014-01-07 19:19:00

+2

此外,而不是if((role&r)!= 0)使用role.HasFlag(r) – dlchambers 2015-07-08 20:42:09

3

爲什麼你需要一個列表?一切都已經存儲在國旗:

[Flags] 
enum Roles 
{ 
    Read = 0x1, 
    Write = 0x2, 
    Delete = 0x4, 
} 

然後分配角色:

var roles = Roles.Read | Roles.Write; 

,每當你需要檢查,如果給定的角色一直是你並不需要在列表中查找,但只需查看角色枚舉:

if ((roles & Roles.Read) == Roles.Read) 
{ 
    // The user has read permission 
} 
if ((roles & Roles.Write) == Roles.Write) 
{ 
    // The user has write permission 
} 
+2

這就是應用程序使用它的方式。但是,這更像是一個持續的關注。我寧願讓這個方法不知道枚舉可能包含的值。 – 2010-09-08 14:10:04

+3

如果是持久性,所有需要存儲的都是表示標誌的單個整數,因爲此整數允許您稍後提取所有角色。無需存儲列表。否則,如果您要保留角色列表,那麼'[Flags]'是不必要的。您還將獲得幾個字節的存儲介質:-) – 2010-09-08 14:11:32

+1

但是,有時候將保存的數據保存在一個有點可讀的格式中很重要。在這種情況下,Enum.Parse可以很好地處理串聯的枚舉值,類似於ToString()如何輸出它們。因此'Enum.Parse(typeof(Roles),「Read,Write」)將產生正確的Read |寫入值。其實我會用這個信息寫一個答案。 – 2010-09-08 14:18:18

7

Enum.Parse將處理的ToString就好輸出連接值。證明使用立即窗口:

? System.Enum.Parse(typeof(System.AttributeTargets), "Class, Enum") 
Class | Enum 

(第二行是輸出,該輸出是在從一般Enum.ToString()輸出的調試器/即時窗口不同)。

21

如果你真的只是想琴絃,不能比簡單得多:

string[] flags = role.ToString().Split(',');

這比使用LINQ簡單,仍然是代碼只是一個單一的線。 或者,如果你想有一個列表,而不是數組中問題的樣本中,你可以將數組轉換成一個列表:

List<string> flags = new List<string>(role.ToString().Split(','));

在我來說,我需要一個通用的解決方案以及與此想出了:

value.ToString().Split(',').Select(flag => (T)Enum.Parse(typeof(T), flag)).ToList();

+0

最佳答案。謝謝! – Ricsie 2016-10-24 07:37:07

相關問題