表的类型化枚举表示
本文关键字:表示 枚举 类型化 | 更新日期: 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 { … }
我不知道。也许注释会更好。