首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从字符串中获取枚举类型

从字符串中获取枚举类型
EN

Stack Overflow用户
提问于 2015-06-09 00:40:51
回答 2查看 423关注 0票数 0

我看过类似的问题,但它们似乎不是在处理我遇到的相同问题。

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

代码语言:javascript
运行
复制
public enum CRUDOperation
    {
        NotNeeded = 0,
        Read = 1,
        Create = 2,
        Update = 4,
        Delete = 8
    }

我没有写下这部分代码,这就是为什么我可能会感到困惑,但随后与角色关联的CRUD权限值将按以下方式放入"Restrictions“字符串中。

代码语言:javascript
运行
复制
            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;
            }

现在我需要解析这个"Restrictions“字符串,以检查给定的角色是否具有适当的CRUDOperation权限级别。然而,字符串充满了随机的ascii字符,我只是很难理解如何正确地做到这一点。我以前从来没有使用过位掩码。我正试着这么做;

代码语言:javascript
运行
复制
CRUDOperation operation = (CRUDOperation)Enum.Parse(typeof(CRUDOperation), p.Restrictions);

但我得到的错误是“请求的值‘’未找到”。

有人有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2015-06-09 01:21:23

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

我不确定为什么限制是以字符串形式保存的。我会将限制类型更改为CRUDOperation,并将第一段代码替换为以下代码:

代码语言:javascript
运行
复制
 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
EN

Stack Overflow用户

发布于 2015-06-09 01:25:27

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

好了,现在是你的答案了。据我所知,这段代码似乎正在构建一个由enum值组成的字符串。因此,如果代码看起来像这样:

代码语言:javascript
运行
复制
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;
}

这将构建一个包含以下内容的字符串,其中包含不可读字符:

代码语言:javascript
运行
复制
0x04, 0x02, 0x01

因此,如果您需要根据此字符串确定某人是否具有权限,则可以执行以下操作:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30714704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档