我有一个" 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
。我知道你想要。
答案 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;
}
}