类似于表的枚举表示

时间:2016-08-23 10:02:44

标签: c# asp.net enums

我有一个" Aspnet_Role"带有字符串值的表格,例如" Admin","主持人"等等。我想对这些值进行类似枚举的表示(手动更新),但是要设置实际的枚举这个在课堂上:

public enum Role
{
    None, Admin, Moderator
}

导致一个尴尬的使用惯例:Aspnet_Role.Role.Admin。我宁愿做到:Aspnet_Role.Admin

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

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

然后我失去了枚举的强大打字优势。例如,使用枚举我可以创建一个很好的帮助方法,如:

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

有没有办法在没有Aspnet_Role.Role命名和用法的情况下在我的表中创建强类型(即无字符串)类似枚举的枚举?

如果每个值只出现在代码中一次,那将是非常优选的。只有枚举,情况就是这样。使用字符串属性,每个值将是两次。使用枚举AND属性,例如:

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

每个值三次!不漂亮。哦,请不要建议Reflection。我知道你想要。

3 个答案:

答案 0 :(得分:0)

首先 - 我将该角色存储为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);

答案 1 :(得分:0)

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

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

    public partial class Aspnet_Role { }
}

有一些方法来表明枚举以某种方式对应于Aspnet_role类会很好。也许是通过属性?

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

我不知道。也许评论会更好。

答案 2 :(得分:0)

只是类型安全枚举的一个示例:

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;
    }
}