C Sharp中的仿真值类型多态性

时间:2009-11-05 20:06:02

标签: c# asp.net

我正在寻找一种创建某种值类型分层类结构的方法。我知道枚举不支持继承,因为它们是值类型,因此是密封的,所以我可能正在寻找某种静态类实现。

我的目的是重新定义我正在处理的ASP.NET应用程序中的角色。目前,角色是字符串常量(ROLE_ADMIN,ROLE_USER等)并放在会话中并在整个应用程序中检查如下:Person.getRole()== ROLE_ADMIN(实际上是字符串比较)。我想重构这一点,以便我可以具有类型安全性,以及下面描述的某种多态行为。

考虑以下角色结构:

             user1
      Group1
             user2
Admin
      User3

如果某人的角色设置为Group1,但页面上的某个元素只能由user1显示,那么我希望语句Person.getRole()== user1为true。

编辑:

将上述结构视为树,我希望能够根据叶子或节点定义用户,并根据叶子或节点检查权限。然而,这会引发两难,根据节点检查权限是否检查用户是属于组(group1)还是IS组(Admin)。 我认为问题在于将树的根节点命名为“Admin”会产生误导,因为节点应该被视为组而不是角色本身。根节点应该类似于'All',当它被定义为'All'时,它将继承树的所有叶子,因此属于所有组。

3 个答案:

答案 0 :(得分:1)

我不确定哪些值类型与此有关(字符串是引用类型)。这里常见的方法是使用IPrincipal.IsInRole或类似的东西。

您的“等级”问题将转移到角色填充的部分。

答案 1 :(得分:0)

猜猜用户必须登录?所以当他们登录时为什么不在会话中添加用户对象?

// Object to represent a user
public class SiteUser
{
    public String Name { get; set; }
    public UserTypes UserType { get; set; }
}

// Enumeration of user types
public enum UserTypes : int
{
    Admin = 1,
    General = 2
}

public partial class Home : System.Web.UI.Page 
{    
    private void Login()
    {
        // Login method here, take username password etc...
        // This is for example purposes...
        SiteUser user = new SiteUser();

        user.UserType = UserTypes.Admin;
        user.Name = "Bob";

        Session["User"] = user;
    }
}

public partial class AdminOnlyPage : System.Web.UI.Page 
{    
    private void Page_Load(object sender, EventArgs e)
    {
        // On pages where we want to know the user details
        // cast the session user object back to our SiteUser object.
        SiteUser user = Session["User"] as SiteUser;

        // This page is admin only, if our user in session isn't an admin
        // then redirect them else where...
        if (user.UserType != UserTypes.Admin)
        {
            Response.Redirect("/LoginPage.aspx");
        }
    }
}

答案 2 :(得分:0)

使用对象模拟值类型语义的一种方法是不可变对象。如果这是一个不熟悉的概念,那么短版本是“在构建之后它们不会改变状态”,这不是设置者,没有公共领域(但是谁会以任何方式做这种愚蠢的事情; p)并且没有副作用的方法。 / p>

Eric Lippert撰写了一篇关于不变性概念的非常精彩的文章: immutability part one