表的类型化枚举表示

本文关键字:表示 枚举 类型化 | 更新日期: 2023-09-27 18:03:45

我有一个"Aspnet_Role"表的字符串值,如"Admin", "Moderator"等。我希望这些值有一个类似枚举的表示(手动更新),但是在类中放置一个像这样的实际枚举:

public enum Role
{
    None, Admin, Moderator
}

导致一个尴尬的使用约定:Aspnet_Role.Role.Admin。我宁愿能做:Aspnet_Role.Admin

我想到了一些类似字符串属性的东西:

public static string Admin { get { return "Admin"; } }

,但是我失去了枚举的强类型优势。例如,使用enum,我可以创建一个很好的辅助方法,如:

public static bool IsUserInRole(Aspnet_Role.Role role){
    return System.Web.HttpContext.Current.User.IsInRole(role.ToString());
}

是否有一种方法来创建一个强类型(即没有字符串)枚举的值在我的表没有Aspnet_Role.Role命名和使用?

如果每个值只在代码中出现一次,那将是非常可取的。如果只是枚举,情况就是这样。如果使用字符串属性,则每个值将被调用两次。使用enum AND属性,如:

public static Role Admin { get { return Role.Admin; 

应该是每个值三次!不漂亮。哦,请不要推荐Reflection。我知道你想。

表的类型化枚举表示

首先,我会在数据库中将角色存储为integer,而不是string

但是如果您坚持使用字符串值,则创建如下属性:

public Role UserRole { get; set; }

那么你可以从数据库中加载它并将其分配给属性:

string role = // load it here from db
this.UserRole = (Role)Enum.Parse(typeof(Role), role);

但是仍然将其存储为int是更好的选择。

编辑:

如果你按照我的建议使用int,分配给属性将是:

int role = // load it here from db
this.UserRole = (Role)Enum.ToObject(typeof(Role), role);

只是一个类型安全enum的例子:

public class Aspnet_Role
{
    public static readonly Aspnet_Role None = new Aspnet_Role(Roles.None, "None");
    public static readonly Aspnet_Role Admin = new Aspnet_Role(Roles.Admin, "Admin");
    public static readonly Aspnet_Role Moderator = new Aspnet_Role(Roles.Moderator, "Moderator");
    private Aspnet_Role(Roles role, string name)
    {
        Role = role;
        Name = name;
    }
    public enum Roles
    {
        None,
        Admin,
        Moderator
    }
    public Roles Role { get; private set; }
    public string Name { get; private set; }
    public Aspnet_Role Parse(Roles role)
    {
        switch(role)
        {
            case Roles.Moderator:
                return Moderator;
            case Roles.Admin:
                return Admin;
            case Roles.None:
            default:
                return None;
        }
    }
    public bool IsUserInRole(Aspnet_Role role)
    {
        return Role == role.Role;
    }
    public override bool Equals(object obj)
    {
        if (obj is Aspnet_Role)
        {
            return Role == ((Aspnet_Role)obj).Role;
        }
        return false;
    }
    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
    public override string ToString()
    {
        return Name;
    }
}

根据ConnersFan的评论,您可以在与Aspnet_Role类相同的命名空间中声明枚举,并根据需要使用它:

namespace DataLayer
{
    public enum Role
    {
        None,
        Admin,
        Etc
    };
    public partial class Aspnet_Role { }
}

如果能以某种方式表明枚举与Aspnet_role类对应就好了。也许是通过属性?

[Represents(Aspnet_Role)]
public enum Role { … }

我不知道。也许注释会更好。