C# 正在分析要转换为枚举类型的字符串
我正在ASP.net中编写一个web应用程序,并从SQL中为每个用户提取一系列权限。如何将所述字符串转换为枚举 我尝试了Enum.TryParsevalue,Enum.type;这不符合我想要达到的目标 这是我的枚举:C# 正在分析要转换为枚举类型的字符串,c#,asp.net,C#,Asp.net,我正在ASP.net中编写一个web应用程序,并从SQL中为每个用户提取一系列权限。如何将所述字符串转换为枚举 我尝试了Enum.TryParsevalue,Enum.type;这不符合我想要达到的目标 这是我的枚举: private enum Permission { NOTES, LOGS, SUPERUSER }; 以下是我的SQL权限字符串: [`notes`,1],`logs`,1],`superUser`,1]] 我希望将字符串中的权限和每个权限的值与枚举类
private enum Permission
{
NOTES,
LOGS,
SUPERUSER
};
以下是我的SQL权限字符串:
[`notes`,1],`logs`,1],`superUser`,1]]
我希望将字符串中的权限和每个权限的值与枚举类型相关联。如何执行此操作?如果启用了1,但禁用了0,则我看不到枚举的工作方式 您可以使用字典,通过一些字符串操作,您可以将db中的值直接输入字典
var perms = "[[`notes`,1],[`logs`,1],[`superUser`,1]]"; // Assuming the format is always the same...
var results = perms.Split("],")
.Select(x => x.Replace("`", string.Empty)
.Replace("[", string.Empty)
.Replace("]", string.Empty))
.Select(c => new KeyValuePair<Permission, bool>(Enum.Parse<Permission>(c.Split(',')[0].Trim().ToUpper()), c.Split(',')[1].Trim() == "1"))
.ToDictionary(x => x.Key, x => x.Value);
编辑:
更新上面的代码以使用权限枚举好的,首先,我认为您需要更好地了解枚举是什么以及它们是如何工作的。它们不能都有相同的数值。让我们从这里开始:
enum Permission
{
NOTES = 1,
LOGS = 2,
SUPERUSER = 3
};
class PermissionValue
{
public Permission Permission { get; set; }
public bool IsActive { get; set; }
}
在这里,您有一个有效的枚举权限,然后是一个对象,该对象包含一个来自权限的选项和一个bool,用于告诉我们枚举是否处于活动状态。现在,让我们来看看如何解析你那奇怪的字符串!
// This is the string you get from the database:
string dbEnumValues = "[[`notes`,1],[`logs`,1],[`superUser`,1]]";
// We need to clean it up:
dbEnumValues = dbEnumValues.Replace("[[", "").Replace("]]", "").Replace("],", "").Replace("`", "");
// The line of code above will give us this: "notes,1[logs,1[superUser,1"
// Now, we can split this into an array of strings:
var enumValues = dbEnumValues.Split('[');
List<PermissionValue> permissionValues = new List<PermissionValue>();
// Next, let's loop over your array and split it further into
// 1) an option from Permission
// 2) a true or false for IsActive
foreach (var permission in enumValues)
{
string enumName = permission.Split(',')[0];
string isActive = permission.Split(',')[1];
PermissionValue permissionValue = new PermissionValue
{
Permission = (Permission)Enum.Parse(typeof(Permission), enumName, true),
IsActive = isActive == "1" ? true : false
};
permissionValues.Add(permissionValue);
}
1是启用的标志吗?每个枚举参数具有相同值1的原因是什么???它将编译,但所有枚举值都将相等。C将在内部仅使用int值进行比较!您是否直接从DB表中的单个单元格提取此字符串?如果是,那么您已经有问题了。在您的枚举权限中,您为NOTES、LOGS和SUPERUSER提供了相同的数值1。那是毫无意义的。编译器不会知道它们之间的区别,会将它们视为相同的东西。戴上我的心灵调试帽,我猜您想要的是一个枚举,如:私有枚举权限{Notes,Log,SuperUser};。然后,您需要一个字典,用于跟踪哪些权限已启用,哪些权限未启用。然后,将该字符串从JSON反序列化到该字典中。但是,这只是一个猜测。您的问题没有足够的信息让我做更多的工作。您可以使用Enum.ParseType、String、Boolean并将最终参数设置为true,以避免将enumName转换为大写。@PaulF。。。我洗耳恭听,但不听话。您可以进一步解释吗?请参阅-然后您只需要字符串enumName=permission.Split','[0];不要假设枚举值是大写的。@PaulF,gotchya!据此编辑。
Permission (enum) IsActive
------------------------------
NOTES true
LOGS true
SUPERUSER true