C# 正在分析要转换为枚举类型的字符串

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]] 我希望将字符串中的权限和每个权限的值与枚举类

我正在ASP.net中编写一个web应用程序,并从SQL中为每个用户提取一系列权限。如何将所述字符串转换为枚举

我尝试了Enum.TryParsevalue,Enum.type;这不符合我想要达到的目标

这是我的枚举:

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