如何使用标志枚举属性展平对象集合?

时间:2014-05-01 22:11:42

标签: c# asp.net-mvc enums asp.net-mvc-5 asp.net-identity

我有一个Role对象,它有几个标志枚举属性,每个属性对应一个相关对象。用户可以属于多个角色。我希望获得角色集合并将其展平为单个表示形式,并使用它来限制UI功能。如何展开收藏?

这是我的LINQPad测试中的一些示例代码:

ICollection<Role> roles = new List<Role>();

roles.Add(new Role {
    Name = "Administrator",
    Object1Defaults = DefaultPermissions.Add | DefaultPermissions.Edit | DefaultPermissions.Remove,
    Object2Defaults = DefaultPermissions.Add | DefaultPermissions.Edit | DefaultPermissions.Remove
});
roles.Add(new Role {
    Name = "Manager",
    Object1Defaults = DefaultPermissions.Add | DefaultPermissions.Edit,
    Object2Defaults = DefaultPermissions.Add | DefaultPermissions.Edit
});

public class Role {
    public string Name { get; set; }
    public DefaultPermissions Object1Defaults { get; set; }
    public DefaultPermissions Object2Defaults { get; set; }
}

[Flags]
public enum DefaultPermissions {
    Add = 1 << 0,
    Edit = 1 << 1,
    Remove = 1 << 2
}

当然,我也欢迎提出更好的方法来实现权限。我的计划是在Role数据库中为每个其他对象创建一个枚举,就像使用Object1DefaultsObject2Defaults一样,除了更好的名称和更多它们。

1 个答案:

答案 0 :(得分:0)

首先,我建议不要使用枚举作为标志。它限制了你可以拥有的总数,这可能不是现在的问题,但如果你以后用完了比特,这将是一个大问题。因此,请将您的权限容器设为集合。

一旦你这样做,使用linq,很容易将结果展平成数组(或List,或任何你想要的):

var result = roles.SelectMany(x => Object1Defaults).Distinct().ToArray();