我看过类似的问题,但他们似乎并没有处理我遇到的同样问题。
我有一个用于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);
但我收到错误"请求的值' '没找到。"
有人有任何建议吗?
答案 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;
}