我看过类似的问题,但它们似乎不是在处理我遇到的相同问题。
我有一个CRUD权限测试的枚举,定义为
public enum CRUDOperation
{
NotNeeded = 0,
Read = 1,
Create = 2,
Update = 4,
Delete = 8
}
我没有写下这部分代码,这就是为什么我可能会感到困惑,但随后与角色关联的CRUD权限值将按以下方式放入"Restrictions“字符串中。
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字符,我只是很难理解如何正确地做到这一点。我以前从来没有使用过位掩码。我正试着这么做;
CRUDOperation operation = (CRUDOperation)Enum.Parse(typeof(CRUDOperation), p.Restrictions);
但我得到的错误是“请求的值‘’未找到”。
有人有什么建议吗?
发布于 2015-06-09 01:21:23
您在该代码中的问题是,当您执行以下操作时: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;
,在此之后,您可以通过拆分字符串然后解析它来解析字符串(确保在解析之前删除所有空项)。
发布于 2015-06-09 01:25:27
在回答这个问题之前,我只想指出这是一种糟糕的做事方式。但我假设你继承了代码,你不能改变它。但请记住,代码不应该像这样工作。更好的方法是将其存储在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;
}
https://stackoverflow.com/questions/30714704
复制相似问题