从字符串中获取枚举类型

时间:2015-06-08 16:40:51

标签: c# string enums enumeration

我看过类似的问题,但他们似乎并没有处理我遇到的同样问题。

我有一个用于CRUD权限测试的枚举,定义为

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

我没有编写下一部分代码,这就是为什么我可能会感到困惑,但随后将与角色相关的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字符,我很难理解如何正确地执行此操作。我之前根本没有使用过bitmasks。我试图这样做;

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

但我收到错误"请求的值' '没找到。"

有人有任何建议吗?

2 个答案:

答案 0 :(得分:0)

您在该代码中的问题是,当您执行此操作时:Restrictions += (char)res;您实际上正在添加其代码是您的操作结果的字符。生成的Restrictions字符串无法解析为枚举。

我不确定为什么限制被保留为字符串。我会将限制类型更改为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;之后你可以通过拆分它然后解析它来解析它(make确保在解析之前删除所有空条目。)

答案 1 :(得分: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;
    }