2015-06-08 79 views
0

我已经看过类似的问题,但他们似乎没有处理我遇到的同一问题。从字符串中获取枚举类型

我定义为

public enum CRUDOperation 
    { 
     NotNeeded = 0, 
     Read = 1, 
     Create = 2, 
     Update = 4, 
     Delete = 8 
    } 

的CRUD许可测试枚举我没有写这个代码下一部分这就是为什么我会被混淆,但随后与角色相关联的CRUD权限值按以下方式放入“限制”字符串中。

  Restrictions = ""; 
      foreach (string inCrud in restrictions) 
      { 
       string crud = inCrud.ToUpper(); 
       int res = 0; 
       if (crud.Contains('C')) 
        res |= (char)CRUDOperation.Create; 
       if (crud.Contains('R')) 
        res |= (char)CRUDOperation.Read; 
       if (crud.Contains('U')) 
        res |= (char)CRUDOperation.Update; 
       if (crud.Contains('D')) 
        res |= (char)CRUDOperation.Delete; 
       Restrictions += (char)res; 
      } 

现在我需要通过这个“限制”的字符串进行解析,以检查是否给定的角色具有相应CRUDOperation权限级别。然而,字符串中充满了随机的ascii字符,我只是很难理解如何正确地做到这一点。之前我根本没有使用过掩饰。我正在努力做到这一点;

CRUDOperation operation = (CRUDOperation)Enum.Parse(typeof(CRUDOperation), p.Restrictions); 

但我收到错误“请求值”未找到。“

有没有人有任何建议?

+5

这似乎是一个非常混乱的方式来做一些非常简单的事情。 – Icemanind

+0

我不确定第二段代码如何处理原作者*认为的*代码。使用'Flags'属性会很容易... –

+0

那么它究竟做了什么?我对发生了什么的印象是要么将enum值的char转换添加到限制字符串中? – kdeez

回答

0

您在代码中的问题是,当您这样做时:Restrictions += (char)res;您实际上正在添加其代码是您的操作结果的字符。得到的限制字符串不能被解析为枚举。

我不确定为什么限制保留为字符串。我会改变限制CRUDOperation的类型和替换代码的第一位以这样的:

Restrictions = CRUDOperation.None; 
foreach (string inCrud in restrictions) 
{ 
    string crud = inCrud.ToUpper(); 
    int res = 0; 
    if (crud.Contains('C')) 
     Restrictions |= CRUDOperation.Create; 
    if (crud.Contains('R')) 
     Restrictions |= CRUDOperation.Read; 
    if (crud.Contains('U')) 
     Restrictions |= CRUDOperation.Update; 
    if (crud.Contains('D')) 
     Restrictions |= CRUDOperation.Delete; 
} 

这样,你直接有结果。

如果由于某种原因必须有结果字符串,您需要使用分隔符作为要添加的值:Restrictions += " " + (int)res;之后,可以通过分割字符串并解析字符串来解析字符串(确保删除解析前的任何空条目)。

0

在回答这个问题之前,我只想指出这是一种糟糕的做事方式。但是我假设你继承了代码,你不能改变它。但请记住,代码不应该像这样工作。更好的方法是将其存储在List<CRUDOperation>中,而不是将它全部连接到一个字符串。

好吧,现在为您的答案。据我所知,这段代码似乎在做的是建立一个enum值的字符串。因此,如果代码是这样的:

String Restrictions = ""; 
string[] restrictions = {"U", "C", "R"}; 

foreach (string inCrud in restrictions) 
{ 
    string crud = inCrud.ToUpper(); 
    int res = 0; 
    if (crud.Contains('C')) 
     res |= (char)CRUDOperation.Create; 
    if (crud.Contains('R')) 
     res |= (char)CRUDOperation.Read; 
    if (crud.Contains('U')) 
     res |= (char)CRUDOperation.Update; 
    if (crud.Contains('D')) 
     res |= (char)CRUDOperation.Delete; 
    Restrictions += (char)res; 
} 

这将建立一串字符乱码包含此:

0x04, 0x02, 0x01 

所以,如果你是需要做的是确定某人是否有权限基于这个字符串,你可以这样做:

bool hasReadPermission = HasCrudPermission(Restrictions, CRUDOperation.Read); 
bool hasCreatePermission = HasCrudPermission(Restrictions, CRUDOperation.Create); 
bool hasUpdatePermission = HasCrudPermission(Restrictions, CRUDOperation.Update); 
bool hasDeletePermission = HasCrudPermission(Restrictions, CRUDOperation.Delete); 

    private bool HasCrudPermission(string restrictions, CRUDOperation permission) 
    { 
     return restrictions.Any(c => HasCrudPermission(c, permission)); 
    } 

    private bool HasCrudPermission(char restriction, CRUDOperation permission) 
    { 
     return ((CRUDOperation)restriction) == permission; 
    } 
+0

感谢您的回复。这似乎是最有意义的,所以我试图实现它,但由于某种原因,它只是返回false,除了“Read”,无论如何。不知道为什么。 – kdeez

+0

是否有'restrictions'像我这样构造:'string [] restrictions = {“U”,“C”,“R”};'? – Icemanind